2010-08-01 8 views
36

Voici mon JPA2/définition Hibernate:Hibernate JPA, MySQL et TinyInt (1) pour Boolean au lieu de bits ou char

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

Dans MySql cette colonne est résolu à un bit (1) type de données - qui ne ne travaille pas pour moi. Pour les problèmes hérités, j'ai besoin de mapper le booléen à un tinyint pas un peu. Mais je ne vois pas la possibilité de changer le type de données par défaut. Y a-t-il?

Répondre

31

Essayez le NumericBooleanType. Pour une raison quelconque, cela ne porte pas de nom de type court déclaré que vous auriez à utiliser:

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

Ceci ne correspond à un type de ENTIER mais il fonctionnera probablement très bien avec un TINYINT.

MISE À JOUR: org.hibernate.type.NumericBooleanType Est-ce que ne fonctionne pas avec avec TINYINT dans certains SGBDR. Basculez le type de colonne de base de données sur INTEGER. Ou utilisez une autre valeur Java @Type ou columnDefinition, selon le cas.

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

+0

Fonctionne correctement, mais après avoir changé le bit (1) en int – zaletniy

+0

-1, mais uniquement parce que la réponse de @Dude est meilleure. – Johan

+0

Est-ce que cela fonctionne aussi avec un objet booléen? – Rafael

48

@Type L'annotation est une annotation Hibernate.

En plein JPA2 (avec mise en veille prolongée 3.6+), le chemin vers la carte un champ booléen à un TINYINT (1) Type de SQL à la place de bits (1), est d'utiliser l'attribut columnDefinition. Nb: l'attribut de longueur semble n'avoir aucun effet dans ce cas, alors nous utilisons la syntaxe (1).


Avec Mise en veille prolongée 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 seul moyen est d'utiliser tinyInt1isBit = false dans la chaîne de connexion source de données MySQL comme ceci:

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

Par ailleurs, vous pouvez maintenant utiliser t il attribut de longueur comme ceci:

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

merci beaucoup bro! –

+3

Depuis les alias MySQL 'BOOLEAN' à' TINYINT (1) 'on peut aussi utiliser' columnDefinition = "BOOLEAN" ', ce qui pourrait être un peu plus lisible. – eggyal

+0

vous avez raison, vous pouvez également utiliser l'alias BOOLEAN avec MySQL tant que l'alias est vraiment défini sur TINYINT, ce qui est vrai pour le moment. Par ailleurs, BOOLEAN et TINYINT ne sont pas des types de données SQL standard, vous risquez donc d'échouer si vous changez de dialecte de fournisseur de données (ex: Oracle). – Donatello

1

J'ai eu cette erreur:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]

Et cela a fonctionné pour moi:

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

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

Dans mon objet entité, je mets les éléments suivants:

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

Mon environnement dev a mise en veille prolongée ensemble auto-ddl mettre à jour, quand je déployé en dev, il a créé la table column_name de type tinyint (1).

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

Cette solution est entièrement JPA (n'utilise pas l'annotation de type hibernate) et ne nécessite aucune modification de la chaîne de connexion.