web-dev-qa-db-fra.com

Cartographier une minuscule hibernation booléenne

J'ai un type BOOLEAN dans une table MySQL (TINYINT (1)) et j'essaie de mapper le champ booléen dans une entité, mais cela génère une exception:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: boolean

J'ai changé le champ dans mon entité pour octroyer et apporter les modifications respectives afin qu'il s'agisse d'un booléen, et je reçois:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: tinyint

J'ai essayé d'utiliser l'annotation @Type sur le champ:

@Type(type = "org.hibernate.type.NumericBooleanType")

mais je reçois:

org.hibernate.HibernateException: Wrong column type in maegul.users for column admin. Found: bit, expected: integer
28
Alvin Baena

D'après ce que j'ai lu ici:

org.hibernate.HibernateException: type de colonne incorrect dans maegul.users pour l'administrateur de colonne. Trouvé: bit, attendu: entier

Il semble que Hibernate attend un nombre entier et en ait un peu.

Ce qui signifie que votre annotation est maintenant correcte:

@Type(type = "org.hibernate.type.NumericBooleanType")

Mais peut-être a-t-il mis à jour votre base de données pour la définir en tant que Bit au lieu de nombre entier, d'où l'erreur.

Si vous avez vraiment besoin d'un TinyInt, vous pouvez utiliser @Type AND @Column, pour définir comme Entier, de type TinyInt:

@Column(columnDefinition = "TINYINT")
@Type(type = "org.hibernate.type.NumericBooleanType")
public boolean admin = true;
34
Cyril N.

Mieux vaut utiliser BIT(1) au lieu de TINYINT(1)

@Column(nullable = false, columnDefinition = "BIT", length = 1)
private boolean flag = false;
7
Andrew

Essaye ça: 

  <property name="isPaymentReceived" type="Java.lang.Boolean">
  <column name="IS_PAYMENT_RECEIVED" sql-type="tinyint"/>
</property>
2
Piraba

J'ai pu résoudre ce problème en ajoutant "transformerBitIsBoolean = true" à ma chaîne de connexion MySQL.

Voir cette question: "Trouvé: bit, attendu: boolean" après la mise à niveau de Hibernate 4

Et ce post de forum: https://hibernate.atlassian.net/browse/HHH-6935

1
Matthias Wuttke

Vous pouvez le faire depuis Dialect, ce qui ne nécessitera aucune annotation fastidieuse à tous les endroits:

import org.hibernate.Hibernate;

import org.hibernate.dialect.PostgreSQLDialect;

importer Java.sql.Types;

classe publique PostgresCustomConversionDialect étend PostgreSQLDialect {

public PostgresCustomConversionDialect() {
    super();
    this.registerColumnType( Types.BIT, "numeric(1, 0)" );
    this.registerColumnType( Types.BOOLEAN, "numeric(1, 0)" );
}

public String toBooleanValueString(boolean bool) {
    return bool ? "1" : "0";
}

}

Ensuite, utilisez ce dialecte personnalisé comme dialecte postgres dans - "hibernate.dialect"

0
Mudit Verma

Qu'est-ce qui ne va pas avec sa mise en correspondance en tant qu'int et en utilisant un accesseur (isAdmin) pour obtenir la valeur booléenne. J'espère que vous masquez le type réel de toute façon.

0
Thom

Le mapper comme org.hibernate.type.BooleanType pourrait fonctionner.

Voir http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-value-basic .

0
Daan

Je suis tombé sur une situation similaire avec Hibernate aujourd'hui et j'ai fini par avoir le type de données mysql comme tinyint (1) et j'ai déclaré le type Hibernate comme étant booléen et cela a fonctionné

0
JavaMan

L'annotation @Type est une annotation hibernateà utiliser avec JPA, on peut utiliser l'attribut ColumnDefiniton.

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean isTrue;
0
Ali Arda Orhan