私は最初の単純なHibernateアプリケーションに取り組んでいます。問題の核心は、永続クラスのメンバーの名前を変更し(他のすべての部分に適切な変更を加えて)、アプリケーションを再実行したことです。'hbm2ddl.auto'プロパティには構成xmlで'create'値が割り当てられるため、Hibernateは実行ごとに新しいテーブルを作成することが期待されますが、そうではありません。詳細情報は次のとおりです。
クラス:
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には、特に次のエントリがあります。
<property name="hbm2ddl.auto">create</property>
メインクラス:
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;
} }
上記のコードは期待どおりに機能しています。'hbm2ddl.auto'プロパティをテストするために、Eventクラスの'title'メンバーを'title1'に変更しました。また、setterメソッドとgetterメソッド、およびすべての参照(マッピングxml、Event、およびEventManagerクラス)を更新しました。エラーなしで準拠。しかし、アプリケーションを実行しようとすると、次の例外が表示されます。
スレッド"main"の例外org.hibernate.exception.SQLGrammarException:org.hibernateのorg.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)の'fieldlist'の不明な列'event0_.title1'。 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)のexception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert( SqlExceptionHelper.java:110)at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java: 81)$Proxy6で。executeQuery(Unknown Source)at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)at org.hibernate.loader.Loader.doQuery(Loader.java:829)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections( Loader.java:289)at org.hibernate.loader.Loader.doList(Loader.java:2438)at org.hibernate.loader.Loader.doList(Loader.java:2424)at org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2254)at org.hibernate.loader.Loader.list(Loader.java:2249)at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)atorg.hibernate.hql。 internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)at org.hibernate.internal.SessionImpl.list(SessionImpl.java: 1248)組織で。hibernate.internal.QueryImpl.list(QueryImpl.java:101)at org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56)at org.hibernate.tutorial.hbm.EventManager.main(EventManager.java: 20)原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:sun.reflect.NativeConstructorAccessorImpl.newInstance0(ネイティブメソッド)の「フィールドリスト」の不明な列「event0_.title1」(sun.reflect.NativeConstructorAccessorImpl.newInstance)不明なソース)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(不明なソース)at java.lang.reflect.Constructor.newInstance(不明なソース)at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)at com.mysql .jdbc.Util.getInstance(Util.java:384)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)atcom。mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)at com .mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)atorg.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler。continueInvocation(AbstractStatementProxyHandler.java:122)... 16 more
エラーは、次の行のEventManagerクラスを指しています。
List result = session.createQuery("from Event").list();
'hbm2ddl.auto'プロパティには構成xmlで'create'値が割り当てられるため、Hibernateは実行ごとに新しいテーブルを作成することが期待されますが、そうではありません。問題の解決にご協力ください。
前もって感謝します。