webentwicklung-frage-antwort-db.com.de

"Gefunden: bit, erwartet: boolean" nach Upgrade von Hibernate 4

Ich versuche ein Upgrade von Hibernate 3.6.5 auf 4.0 (und von Spring 3.0.5 auf 3.1, was für die Unterstützung von Hibernate 4 erforderlich ist).

Jetzt, sowohl mit MySQL als auch mit HSQL, stoße ich auf dieses Problem mit persistenten booleschen Feldern:

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)

Die Annotationen JPA @Entity und @Column werden in Domänenobjekten verwendet, und die problematischen Felder sehen folgendermaßen aus:

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

HSQL-Schema:

Checked bit default 0 not null,

MySQL-Schema:

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

Was ist der einfachste Weg, dies zu lösen, während Sie bei Hibernate 4 bleiben? Soll ich das Datenbankschema, die Ruhezustandskonfigurationen oder die Anmerkungen zu den Domänenklassen ändern?

Ich habe keine Ahnung, ob der Code und die Konfiguration zuvor vollständig "korrekt" waren, aber zumindest funktionierte dies mit Hibernate 3 gut.

32
Jonik

Ich habe das herausgefunden, indem ich columnDefinition = "BIT" zur @Column-Zeile hinzugefügt habe.

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

Es ist auch als 'BIT (1)' in der DB definiert. Arbeitete auch mit TINYINT. Dies ist die einfachste Lösung, die ich gefunden habe, da die Änderung sehr klein ist und keine Notwendigkeit besteht, die DB zu berühren.

Verwendung von: MySQL Server 5.5.13, Hibernate 4.1.1, JDK 1.6

45
baba smith

Ich hatte das gleiche Problem und erweiterte den Dialekt, um der Tatsache Rechnung zu tragen, dass mysql boolean als Alias ​​von bit behandelt.

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

Ich verwende keine längeren bit () -Felder (um beispielsweise Byte [] darzustellen).

19
Michal Stawski

Ich konnte dieses Problem durch Hinzufügen von transformedBitIsBoolean=true zu meiner MySQL-Verbindungszeichenfolge lösen. Siehe hier: https://hibernate.atlassian.net/browse/HHH-6935

8
Matthias Wuttke

Dies wurde in einer ähnlichen Frage hier beantwortet:

Hibernate JPA, MySQL und TinyInt (1) für Boolean anstelle von Bit oder Zeichen

Ihr Problem könnte etwas komplizierter sein, wenn Sie gleichzeitig HSQL DB verwenden, aber Sie können es trotzdem ausprobieren und ausprobieren!

0
Donatello

Das Problem gefunden Ich habe auch org.hibernate.HibernateException: Falscher Spaltentyp gefunden

bei BooleanType im Ruhezustand 4 wurde der Ctor in geändert

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

anstelle von alten Versionen 

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