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?
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.
@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;
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;
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.