30 votes

"Trouvé: bit, attendu: booléen" après la mise à niveau d'Hibernate 4

Je suis en train de mettre à niveau à partir d'Hibernate 3.6.5 4.0 (et à partir du Printemps 3.0.5 à 3,1 qui est nécessaire pour Hibernate 4).

Maintenant, à la fois MySQL et HSQL, je suis en cours d'exécution dans ce problème, avec la persistance des champs booléens:

Caused by: org.hibernate.HibernateException: 
Wrong column type in PUBLIC.PUBLIC.EVENT for column Checked. Found: bit, expected: boolean
    at org.hibernate.mapping.Table.validateColumns(Table.java:282)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1268)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:453)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)

JPA @Entity et @Column les annotations sont utilisées dans le domaine des objets, et la problématique des champs ressembler à ceci:

@Column(name = "Checked")
private boolean checked;

HSQL schéma:

Checked bit default 0 not null,

MySQL schéma:

`Checked` tinyint(1) NOT NULL default '0',

Quelle est la façon la plus simple de résoudre ce tout en restant avec Hibernate 4? Devrais-je changer le schéma de base de données, Hibernate configs, ou le domaine de la classe des annotations?

Je n'ai aucune idée si le code et la configuration a été entièrement "correct", mais au moins il a bien fonctionné avec Hibernate 3.

37voto

baba smith Points 517

J'ai travaillé cela en ajoutant columnDefinition = "BIT" à la ligne @Column.

 @Basic
@Column(name = "B", columnDefinition = "BIT", length = 1)
public boolean isB() {
    return b;
}
 

Il est également défini comme un «BIT (1)» dans la DB. A également travaillé avec TINYINT. C'est la solution la plus simple que j'ai trouvée car le changement est super mineur et pas besoin de toucher la base de données.

Utilisation: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6

18voto

Michal Stawski Points 141

J'ai eu le même problème et j'ai étendu le dialecte pour prendre en compte le fait que mysql traite booléen comme un alias de bit.

 public class Mysql5BitBooleanDialect extends MySQL5Dialect{     
    public Mysql5BitBooleanDialect() {
        super();
        registerColumnType( java.sql.Types.BOOLEAN, "bit" );        
    }       
}
 

Je n'utilise pas de champs bit () plus longs (pour représenter par exemple l'octet []), cela pourrait donc casser cela.

6voto

Matthias Wuttke Points 845

J'ai pu résoudre ce problème en ajoutant transformedBitIsBoolean=true à ma chaîne de connexion MySQL. Voir ici: https://hibernate.atlassian.net/browse/HHH-6935

0voto

orasio Points 11

J'ai trouvé le problème, j'ai également eu org.hibernate.HibernateException: type de colonne incorrect ... Trouvé: bit, attendu: booléen

sur BooleanType en hibernate 4, ils ont changé le Ctor en

 public BooleanType() {
    this( org.hibernate.type.descriptor.sql.BooleanTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
 

au lieu des anciennes versions

 public BooleanType() {
    this( BitTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X