"Found: bit, expected: boolean" après la mise à niveau Hibernate 4

j'essaie de passer de la version 3.6.5 à la version 4.0 (et de la version 3.0.5 à la version 3.1 qui est requise pour le support Hibernate 4).

maintenant, avec MySQL et HSQL, je suis en train de rencontrer 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 ressemblent à ceci:

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

schéma HSQL:

Checked bit default 0 not null,

MySQL schema:

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

Quelle est la façon la plus simple de résoudre ce problème tout en restant avec hibernation 4 ? Dois-je modifier le schéma de base de données, les configurations D'hibernation ou les annotations de classe de domaine?

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

32
demandé sur fredt 2011-12-29 16:37:23

5 réponses

j'ai calculé ceci en ajoutant columnDefinition = "BIT" à la ligne de la colonne@.

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

Ses définie comme un "BIT(1)" dans la DB. Il travaillait aussi avec TINYINT. C'est la solution la plus facile que j'ai trouvé puisque le changement est super-mineur et pas besoin de toucher le DB.

utilisant: serveur MySQL 5.5.13, Hibernate 4.1.1, JDK 1.6

43
répondu baba smith 2012-03-29 08:41:21

j'ai eu le même problème et j'ai étendu le dialecte pour tenir compte du 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 les champs longer bit () (pour représenter par exemple byte[]) donc cela pourrait casser cela.

19
répondu Michal Stawski 2013-06-24 00:20:49

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

7
répondu Matthias Wuttke 2014-03-05 14:45:28

a trouvé le problème j'ai aussi eu org.hiberner.HibernateException: mauvais type de colonne ... Trouvé: bit, prévu: booléen

sur BooleanType en hibernation 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 );
}
0
répondu orasio 2013-06-24 00:21:24

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

Hibernate, JPA, MySQL et TinyInt(1) pour les Booléens au lieu de bits ou char

votre problème pourrait être un peu plus compliqué que vous utilisez HSQL DB en même temps, mais vous pouvez jeter un oeil et essayer quand même !

0
répondu Donatello 2017-05-23 12:34:12