"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.
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
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.
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
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 );
}
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 !