web-dev-qa-db-fra.com

Hibernate JPA, MySQL et TinyInt (1) pour Boolean au lieu de bit ou char

Voici ma définition JPA2/Hibernate:

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

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

44
Ta Sas

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

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

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

MISE À JOUR: org.hibernate.type.NumericBooleanType Est-ce que pas fonctionne avec TINYINT dans certains SGBDR. Basculez le type de colonne de base de données sur INTEGER. Ou utilisez une valeur Java @Type différente, 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.

37
Mike Q

L'annotation @Type est une annotation Hibernate.

En JPA2 complet (avec Hibernate 3.6 +), la façon de mapper un champ booléen à un type SQL TINYINT (1) au lieu de BIT (1), consiste à utiliser l'attribut columnDefinition.

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

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


Avec Hibernate 4.0 +, ce type de syntaxe peut provoquer une erreur d'exécution comme celle-ci:

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 de la source de données MySQL comme ceci:

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

Au fait, vous pouvez maintenant utiliser l'attribut length comme ceci:

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

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

Dans mon objet Entity, j'ai mis ce qui suit:

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

Mon environnement de développement a mis en veille automatique auto-ddl pour mettre à jour, donc quand j'ai déployé pour dev, il a créé la table avec nom_colonne de type tinyint (1).

Mon code qui utilise cette colonne considère null comme faux, donc je ne m'inquiète pas des nulls, si vous l'êtes, vous pouvez en faire un booléen primitif ou ajouter ", nullable = false" à l'annotation de colonne.

Cette solution est entièrement JPA (n'utilise pas d'annotation de mise en veille prolongée) et ne nécessite aucune modification de la chaîne de connexion.

3
Annulet Consulting

J'ai eu cette erreur:

Causée par: org.springframework.beans.factory.BeanCreationException: erreur lors de la création du bean avec le nom 'sessionFactory' défini dans la ressource ServletContext [/WEB-INF/config/context-config.xml]: échec de l'invocation de la méthode init; l'exception imbriquée est org.hibernate.MappingException: impossible de déterminer le type pour: org.hibernate.type.NumericBooleanType, à la table: bookingItem, pour les colonnes: [org.hibernate.mapping.Column (activé)]

Et cela a fonctionné pour moi:

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

Lorsque vous utilisez Microsoft SQL et certaines versions de mysql, utilisez les éléments suivants:

@Column(name = "eanbled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;

Pour moi, les définitions de minuscule, booléen et autres ont échoué.

0
Nox