2012-11-29 11 views
5

io sono sempre un'eccezione Hibernate:eccezione Strano Hibernate con la colonna di tipo

sbagliato tipo di colonna. Trovato: bit, previsto: booleano predefinito TRUE

Ho classe 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 
} 

questo funziona correttamente se Hibernate crea tabella stessa nel database. Quando

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

o

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

Ma se

  1. eseguo il mio programma e permettono Hibernate per creare questa tabella
  2. poi modificare il valore della hibernate.hbm2ddl.auto al convalidare
  3. e corro il mio programma di nuovo con la tabella che ha generato da Hibernate e con

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

in modo da ottenere l'eccezione:

org.hibernate.HibernateException: colonna di sbagliato digitare dbtest.user per la colonna STATUS. Trovato: bit, previsto: BOOLEAN DI DEFAULT TRUE

Qualsiasi idea di quello che potrebbe essere la ragione di questo comportamento di Hibernate e come posso risolvere il problema?

Io uso MySQL server 5.1 e Hibernate 4.0.1.

La mia classe Run è a soli due linee:

public class Run { 

    public static void main(String[] main) { 

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

    Session session = sessionFactory.getCurrentSession(); 
    } 
} 

La struttura della tabella:

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 

mio 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 crea la tabella con il tipo TINYINT e Non mi intrometto sui dati base e non apportare modifiche nella tabella manualmente! Sto solo cambiando il hibernate.hbm2ddl.auto per il validate e nient'altro.

+1

correlati: http: // StackOverflow. it/questions/289727 –

+0

Non ho ** il valore predefinito ** nella mia tabella se scelgo 'BIT DEFAULT 1' invece' BOOLEAN DEFAULT TRUE' nelle annotazioni. Ottengo 'STATUS BIT (1) NOT NULL' in db. –

+1

Quindi la mia domanda può essere riformulata come segue: ** Come dichiarare correttamente un valore di default per un campo booleano usando l'annotazione di Hibernate? ** –

risposta

0
private Boolean status = Boolean.TRUE; 

Nel caso in cui il valore predefinito sia già vero.

Un altro modo per risolvere questo problema sta usando:

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

annotazioni supposizione visto che non ho usato formano la mappatura, ma qui va:

Che ColumnDefinition sembra dire esplicitamente Hibernate per usa il tipo di colonna booleana con il valore predefinito true, ma MySql non ha il tipo booleano, quindi forse

columnDefinition = "BOOLEAN DEFAULT TRUE" 

dovrebbe essere qualcosa di simile

columnDefinition = "tinyint DEFAULT 1" 
2

Come gli altri ragazzi già detto: Non v'è alcun tipo booleano colonne in MySql. Ho avuto un problema simile e ho "creato" un proprio dialetto. Estende il predefinito MySQL5Dialect e registra il tipo di SQLard standard BOOLEAN sul bit di tipo di colonna MySql.

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

È quindi possibile utilizzarlo impostando il dialetto nelle proprietà di Hibernate: hibernate.dialect = your.package.Mysql5BitBooleanDialect

Spero che questo aiuti ..