web-dev-qa-db-fra.com

"Trouvé: bit, attendu: boolean" après la mise à niveau vers Hibernate 4

J'essaie de passer d'Hibernate 3.6.5 à 4.0 (et de Spring 3.0.5 à 3.1, ce qui est nécessaire pour la prise en charge d'Hibernate 4).

Maintenant, avec MySQL et HSQL, je rencontre ce problème avec les champs booléens persistants:

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 les objets de domaine et les champs problématiques se présentent comme suit:

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

Schéma HSQL:

Checked bit default 0 not null,

Schéma MySQL:

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

Quel est le moyen le plus simple de résoudre ce problème tout en restant avec Hibernate 4? Devrais-je changer le schéma de base de données, les configurations Hibernate ou les annotations de classe de domaine?

Je n'ai aucune idée si le code et la configuration étaient totalement "corrects" auparavant, mais au moins, cela fonctionnait bien avec Hibernate 3.

32
Jonik

J'ai résolu le problème 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 base de données. Également travaillé avec TINYINT. C'est la solution la plus simple que j'ai trouvée depuis que le changement est super mineur et nul besoin de toucher à la base de données.

Utilisation de: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6

45
baba smith

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 byte []), donc cela pourrait casser cela.

19
Michal Stawski

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

8
Matthias Wuttke

Ceci a été répondu dans une question similaire ici:

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

Votre problème pourrait être un peu plus compliqué si vous utilisez HSQL DB en même temps, mais vous pouvez jeter un coup d'œil et l'essayer quand même!

0
Donatello

Trouvé le problème J'ai aussi eu org.hibernate.HibernateException: type de colonne incorrect ... trouvé: bit, attendu: boolean

sur BooleanType en veille prolongée 4, ils ont changé le Ctor en

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

au lieu d'anciennes versions 

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