2012-11-29 5 views
5

ich Hibernate Ausnahme bin immer:Seltsam Hibernate Ausnahme mit Spaltentyp

Falscher Spaltentyp. Gefunden: bit, erwartet: Wahrheitswert Voreinstellung TRUE

Ich habe Klasse User:

package mypackage; 

import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List; 

@Entity 
@Table(name = "USER") 
public class User { 

    @Id 
    @GeneratedValue 
    @Column(name = "ID", unique = true, nullable = false) 
    private Long id; 

    @Column(name = "STATUS", columnDefinition = "BOOLEAN DEFAULT TRUE", 
           nullable = false) 
    private Boolean status = Boolean.TRUE; 

    // getters and setters 
} 

Dies funktioniert einwandfrei, wenn Hibernate Tabelle erstellt sich in der Datenbank. Wenn

<property name="hibernate.hbm2ddl.auto">create</property> 

oder

<property name="hibernate.hbm2ddl.auto">create-drop</property> 

Aber wenn

  1. ich mein Programm laufen und erlauben Hibernate diese Tabelle zu erstellen
  2. dann ändere ich den Wert von hibernate.hbm2ddl.auto zum validieren
  3. und ich laufe mein Programm wieder mit der Tabelle, die von Hibernate und mit

    <property name="hibernate.hbm2ddl.auto">validate</property> 
    

so bekomme ich die Ausnahme erzeugt hat:

org.hibernate.HibernateException: Falsche Spalte Geben Sie dbtest.user für die Spalte STATUS ein. Gefunden: bit, erwartet: Wahrheitswert Voreinstellung TRUE

Jede Idee, was der Grund für dieses Verhalten von Hibernate sein könnte und wie kann ich es beheben?

Ich verwende MySQL server 5.1 und Hibernate 4.0.1.

Meine Run Klasse ist nur zwei Zeilen:

public class Run { 

    public static void main(String[] main) { 

    SessionFactory sessionFactory = 
       new AnnotationConfiguration().configure().buildSessionFactory(); 

    Session session = sessionFactory.getCurrentSession(); 
    } 
} 

Die Struktur der Tabelle:

CREATE TABLE USER (
    ID BIGINT(20) NOT NULL AUTO_INCREMENT, 
    STATUS TINYINT(1) NOT NULL DEFAULT 1, 
    PRIMARY KEY (ID), 
    UNIQUE INDEX ID (ID) 
) 
COLLATE='utf8_general_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=2 

Mein hibernate.cfg:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/dbtest</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="connection.pool_size">5</property> 
    <property name="hibernate.transaction.flush_before_completion">true</property> 
    <property name="hibernate.transaction.auto_close_session">true</property> 
    <property name="hibernate.hbm2ddl.auto">validate</property> 
    <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.use_sql_comments">false</property> 
    <property name="hibernate.connection.charSet">true</property> 

    <mapping class="mypackage.User"/> 
    </session-factory> 
</hibernate-configuration> 

Hibernate die Tabelle mit Typ erstellt TINYINT und Ich vermittele die Daten nicht Basis und nehmen Sie keine Änderungen in der Tabelle manuell vor! Ich ändere nur die hibernate.hbm2ddl.auto in die validate und sonst nichts.

+1

Verwandte: http: // Stackoverflow. com/questions/289727 –

+0

Ich habe nicht ** Standardwert ** in meiner Tabelle, wenn ich "BIT DEFAULT 1" anstatt "BOOLEAN DEFAULT TRUE" in Anmerkungen wähle. Ich bekomme 'STATUS BIT (1) NOT NULL' in db. –

+1

So kann meine Frage wie folgt umformuliert werden: ** Wie man einen Standardwert für ein boolean Feld mit der Hibernate Annotation korrekt erklärt? ** –

Antwort

0
private Boolean status = Boolean.TRUE; 

Sollte bereits der Standardwert true sein.

Ein anderer Weg zur Lösung dieses Problems verwendet:

@PrePersist 
public void prePersist() 
{ 
    if (status == null) 
    { 
     status = Boolean.TRUE; 
    } 
} 
0

wilde Vermutung da ich nicht verwendet Anmerkungen Mapping bilden, aber hier geht:

Das Column wie Hibernate ausdrücklich sagen, schaut zu benutze einen booleschen Spaltentyp mit dem Standardwert true, aber MySql hat keinen booleschen Typ, also vielleicht

columnDefinition = "BOOLEAN DEFAULT TRUE" 

sollte so etwas sein

columnDefinition = "tinyint DEFAULT 1" 
2

Wie die anderen Jungs schon gesagt haben: Es gibt keinen booleschen Spaltentyp in MySql. Ich hatte ein ähnliches Problem und "kreierte" einen eigenen Dialekt. Es erweitert den Standard-MySQL5Dialect und registriert den Stanard-SQL-Typ BOOLEAN auf das MySql-Spaltentyp-Bit.

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

Sie können dann verwenden, um den Dialekt in Ihren Hibernate Eigenschaften festlegen: hibernate.dialect = your.package.Mysql5BitBooleanDialect

this helps ..