2012-11-29 2 views
5

Je reçois exception Hibernate:exception étrange Hibernate avec le type de colonne

type de colonne incorrect. Trouvé: Un peu, attendu: BOOLEAN DEFAULT TRUE

Je classe utilisateur:

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 
} 

Cela fonctionne correctement si Hibernate crée lui-même la table dans la base. Lorsque

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

ou

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

Mais si

  1. je lance mon programme et permettent Hibernate de créer ce tableau
  2. puis-je changer la valeur de hibernate.hbm2ddl.auto au valider
  3. et je lance mon programme à nouveau avec la table qui a généré par Hibernate et

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

si je reçois l'exception:

org.hibernate.HibernateException: mauvaise colonne tapez dbtest.user pour la colonne STATUS. Trouvé: Un peu, attendu: BOOLEAN DEFAULT TRUE

Toute idée de ce qui pourrait être la raison de ce comportement de mise en veille prolongée et comment puis-je résoudre ce problème?

J'utilise MySQL server 5.1 et Hibernate 4.0.1.

Ma classe Run est à seulement deux lignes:

public class Run { 

    public static void main(String[] main) { 

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

    Session session = sessionFactory.getCurrentSession(); 
    } 
} 

La structure de la table:

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 

Mon 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 crée la table avec le type TINYINT et Je n'interromps pas sur les données base et ne faites pas de modifications dans la table manuellement! Je suis juste changer le hibernate.hbm2ddl.auto au validate et rien d'autre.

+1

connexes: http: // stackoverflow. com/questions/289727 –

+0

Je n'ai pas ** valeur par défaut ** dans ma table si je choisis 'BIT DEFAULT 1' à la place' BOOLEAN DEFAULT TRUE' dans les annotations. J'ai 'STATUS BIT (1) NOT NULL' dans db. –

+1

Donc ma question peut être reformulée comme suit: ** Comment déclarer correctement une valeur par défaut pour un champ booléen en utilisant l'annotation Hibernate? ** –

Répondre

0
private Boolean status = Boolean.TRUE; 

La valeur par défaut devrait déjà être true.

Une autre façon de résoudre ce problème utilise:

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

conjecture sauvage depuis que je ne l'ai pas utilisé des annotations forment la cartographie, mais va ici:

Ce columnDefinition ressemble à dire explicitement mise en veille prolongée à utilisez le type de colonne booléen avec la valeur par défaut true, mais MySql n'a pas de type booléen, donc peut-être

columnDefinition = "BOOLEAN DEFAULT TRUE" 

devrait être quelque chose comme ceci

columnDefinition = "tinyint DEFAULT 1" 
2

Comme les autres gars ont déjà dit: Il n'y a pas de type de colonne booléenne dans MySql. J'ai eu un problème similaire et "créé" un propre dialecte. Il étend le MySQL5Dialect par défaut et enregistre le BOOLEAN de type sql stanard dans le bit de type de colonne MySql.

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

Vous pouvez alors l'utiliser en définissant le dialecte dans les propriétés de mise en veille prolongée: hibernate.dialect = your.package.Mysql5BitBooleanDialect

Hope this helps ..

Questions connexes