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
- je lance mon programme et permettent Hibernate de créer ce tableau
- puis-je changer la valeur de
hibernate.hbm2ddl.auto
au valider 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.
connexes: http: // stackoverflow. com/questions/289727 –
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. –
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? ** –