Hibernate JPA, MySQL et TinyInt(1) pour les Booléens au lieu de bits ou de char

voici ma définition de JPA2 / Hibernate:

Code:
@Column(nullable = false)
private boolean enabled;

dans MySql cette colonne est résolue à un type de données bit(1) - qui ne fonctionne pas pour moi. Pour les questions d'héritage je dois mapper le booléen à un tinyint pas à un peu. Mais je ne vois aucune possibilité de changer le type de données par défaut. Est-ce là tout?

38
demandé sur Ta Sas 2010-08-01 22:12:12

4 réponses

essayez le NumericBooleanType . Pour une raison quelconque, cela n'a pas un nom de type court déclaré donc vous devez utiliser:

@Column(nullable = false)
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean enabled;

cela correspond à un type entier mais cela fonctionnera probablement très bien avec un TINYINT.

mise à JOUR: org.hibernate.type.NumericBooleanType Ne pas travailler avec TINYINT dans certains SGBDR. Passez le type de colonne de la base de données à ENTIER. Ou utilisez une autre valeur Java @Type, ou columnDefinition, selon le cas.

dans cet exemple, la réponse de Dude de @Column(nullable = false, columnDefinition = "TINYINT(1)") fonctionnerait sans aucune modification de la base de données.

34
répondu Mike Q 2012-08-13 17:56:21

@Type d'annotation est une Hibernate annotations.

in full JPA2 (with Hibernate 3.6+ ), la façon de cartographier un champ booléen à un type de SQL TINYINT(1) au lieu de BIT(1), est d'utiliser l'attribut columnDefinition.

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;

nb: l'attribut length ne semble pas avoir d'effet dans ce cas, alors nous utilisons la syntaxe (1).


avec hibernation 4.0+ , ce type de syntaxe peut provoquer une erreur d'exécution comme ceci :

Wrong column type Found: bit, expected: TINYINT(1)

il semble que dans ce cas, votre seule façon est d'utiliser tinyInt1isBit=false dans la chaîne de connexion MySQL datasource comme ceci:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false

soit dit en passant, vous pouvez maintenant utiliser l'attribut length comme ceci:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1)
private boolean enabled;
51
répondu Donatello 2014-09-25 14:19:10

j'ai eu cette erreur:

causé par: org.springframework.haricot.usine.BeanCreationException: Erreur créant bean avec le nom "sessionFactory" défini dans ServletContext de ressources [/WEB-INF/config/contexte-config.XML]: L'Invocation de la méthode init a échoué; l'exception imbriquée est org.hiberner.MappingException: impossible de déterminer le type pour: org.hiberner.type.NumericBooleanType, à la table: bookingItem, pour colonne: [org.hiberner.cartographie.Colonne (activée)]

et cela a fonctionné pour moi:

@Column(nullable = false, columnDefinition = "TINYINT(1)")
private boolean enabled;
1
répondu marioarranzr 2016-08-19 19:15:06

J'utilise JPA avec Spring Data/Hibernate 5.0 sur une base de données MySQL.

dans mon objet D'entité, j'ai mis ce qui suit:

@Column(name = "column_name", columnDefinition = "BOOLEAN")
private Boolean variableName;

mon environnement dev a hiberné auto-ddl mis à jour, donc quand je me suis déployé à dev, il a créé la table avec column_name de type tinyint(1).

mon code qui utilise cette colonne considère nul comme faux, donc je ne suis pas inquiet pour nulls, si vous l'êtes, vous pourriez en faire un booléen primitif ou ajouter", nullable = false " à l'annotation de la colonne.

cette solution est entièrement JPA (n'utilise pas d'annotation de type hibernate) et ne nécessite aucun changement à la chaîne de connexion.

1
répondu Annulet Consulting 2017-11-26 00:10:49