Hibernate " hbm2ddl.auto' de la propriété avec la valeur "créer" n'est pas re-création de la table
Je travaille sur mon d'abord simple d'applications Hibernate. Le noeud du problème est, que j'avais renommé un membre de la classe persistante (avec apt changements à toutes les autres parties) et de ré-exécuter l'application. Comme " hbm2ddl.auto", le bien est attribué à "créer" de la valeur dans la configuration xml, Hibernate est prévu de créer un nouveau tableau sur chaque course, mais ça ne le fait pas. Voici des informations détaillées:
CLASSE:
public class Event {
private Long id;
private String title;
private Date date;
public Event() {
//this form used by Hibernate
}
public Event(String title, Date date) {
//for application use, to create new events
this.title = title;
this.date = date;
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Event.hbm.xml:
<hibernate-mapping package="org.hibernate.tutorial.hbm">
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="increment"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
hibernate.cfg.xml, entre autres, a d'entrée suivantes:
<property name="hbm2ddl.auto">create</property>
CLASSE PRINCIPALE:
public class EventManager {
public static void main(String[] args) {
EventManager mgr = new EventManager();
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println( "Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate() );
}
HibernateUtil.getSessionFactory().close();
}
private List listEvents() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Event").list();
session.getTransaction().commit();
return result;
} }
Le code ci-dessus fonctionne comme prévu. Juste pour tester 'hbm2ddl.auto, j'avais changé le titre de " membre de la classe Event 'title1'. Et, mis à jour setter et getter méthodes et toutes les références (dans le mappage xml, des Événements et des EventManager classe). Respecté aucune erreur. Mais, quand j'essaye d'exécuter l'application, je vois exception suivante:
Exception in thread "main" org.mise en veille prolongée.exception à la règle.SQLGrammarException: Unknown column 'event0_.title1' in 'field list'
au org.mise en veille prolongée.exception à la règle.interne.SQLExceptionTypeDelegate.convertir(SQLExceptionTypeDelegate.java:82)
au org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
au org.mise en veille prolongée.moteur.jdbc.le spi.SqlExceptionHelper.convertir(SqlExceptionHelper.java:125)
au org.mise en veille prolongée.moteur.jdbc.le spi.SqlExceptionHelper.convertir(SqlExceptionHelper.java:110)
au org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
au org.mise en veille prolongée.moteur.jdbc.interne.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
à $Proxy6.executeQuery(Source Inconnue)
au org.mise en veille prolongée.loader.Loader.getResultSet(Loader.java:1953)
au org.mise en veille prolongée.loader.Loader.doQuery(Loader.java:829)
au org.mise en veille prolongée.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
au org.mise en veille prolongée.loader.Loader.doList(Loader.java:2438)
au org.mise en veille prolongée.loader.Loader.doList(Loader.java:2424)
au org.mise en veille prolongée.loader.Loader.listIgnoreQueryCache(Loader.java:2254)
au org.mise en veille prolongée.loader.Loader.liste(Loader.java:2249)
au org.mise en veille prolongée.loader.hql.QueryLoader.liste(QueryLoader.java:470)
au org.mise en veille prolongée.hql.interne.ast.QueryTranslatorImpl.liste(QueryTranslatorImpl.java:355)
au org.mise en veille prolongée.moteur.de la requête.le spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
au org.mise en veille prolongée.interne.SessionImpl.liste(SessionImpl.java:1248)
au org.mise en veille prolongée.interne.QueryImpl.liste(QueryImpl.java:101)
au org.mise en veille prolongée.didacticiel.hbm.EventManager.listEvents(EventManager.java:56)
au org.mise en veille prolongée.didacticiel.hbm.EventManager.principale(EventManager.java:20)
Causés par: com.mysql.jdbc.des exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'event0_.title1' in 'field list'
au coucher du soleil.de réfléchir.NativeConstructorAccessorImpl.newInstance0(Native method)
au coucher du soleil.de réfléchir.NativeConstructorAccessorImpl.newInstance(Source Inconnue)
au coucher du soleil.de réfléchir.DelegatingConstructorAccessorImpl.newInstance(Source Inconnue)
à java.lang.de réfléchir.Constructeur.newInstance(Source Inconnue)
au com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
au com.mysql.jdbc.Util.getInstance(Util.java:384)
au com.mysql.jdbc.La fonction SQLError.createSQLException(SQLError.java:1054)
au com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)
au com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)
au com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
au com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)
au com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)
au com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)
au com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke(Source Inconnue)
au coucher du soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(Source Inconnue)
à java.lang.de réfléchir.La méthode.invoke(Source Inconnue)
au org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 16 plus
De l'erreur de pointage de classe EventManager à la ligne suivante:
List result = session.createQuery("from Event").list();
Comme " hbm2ddl.auto", le bien est attribué à "créer" de la valeur dans la configuration xml, Hibernate est prévu de créer un nouveau tableau sur chaque course, mais ça ne le fait pas. S'il vous plaît aider à résoudre le problème.
Merci d'avance.
OriginalL'auteur user1418717 | 2012-05-28
Vous devez vous connecter pour publier un commentaire.
Essayez de spécifier
hibernate.hbm2ddl.auto=create
au lieu de simplementhbm2ddl.auto=create
.C'est ce que le la documentation utilise.
Alex, 2/2: Donc, la dernière instruction d'erreur indique clairement le problème que j'avais négligé, plus tôt. Comme je travaillais avec des exemples, j'avais créé table PERSONNE qui avait many2many relation avec les ÉVÉNEMENTS de table, qui a été couronnée de succès. Ensuite, j'ai essayé de changer le titre de " membre en procédant comme indiqué à l'OP et de commenter entrée de mappage dans le fichier de configuration pour la table PERSONNE. Hibernate signalé l'erreur, mais, j'avais oublié. Comme je suis un nouveau membre, je peux pas voter, sinon, j'aurais sûrement fait. En tout cas, Merci encore.
Mais si vous l'utilisez, vous pouvez perdre des données, car il peut supprimer des données actuelles. Mise à jour devrait fonctionner.
Génial petit conseil. Juste m'a sauvé d'un mal de tête énorme. +1
Pour éviter le même genre d'erreurs, d'utiliser
org.hibernate.cfg.AvailableSettings
et son les attributs statiquesOriginalL'auteur Alex Barnes
Essayer
<property name="hibernate.hbm2ddl.auto">create</property>
au lieu de<property name="hbm2ddl.auto">create</property>
OriginalL'auteur Sachchidanand Singh