我正在处理我的first simple Hibernate application。问题的症结在于,我已经重命名了持久化类的成员(对所有其他部分进行了适当的更改)并重新运行应用程序。由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,所以Hibernate应该在每次运行时创建新表,但是,它没有这样做。以下是详细信息:
CLASS:
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:'字段列表'中的未知列'event0_.title1' 在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) 在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 在org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 在$ Proxy6.executeQuery(未知来源) 在org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 在org.hibernate.loader.Loader.doQuery(Loader.java:829) 在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) 在org.hibernate.loader.Loader.doList(Loader.java:2438) 在org.hibernate.loader.Loader.doList(Loader.java:2424) 在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254) 在org.hibernate.loader.Loader.list(Loader.java:2249) 在org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 在org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 在org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 在org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) 在org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 在org.hibernate.tutorial.hbm.EventManager.listEvents(EventManager.java:56) 在org.hibernate.tutorial.hbm.EventManager.main(EventManager.java:20) 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'字段列表'中的未知列'event0_.title1' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 在com.mysql.jdbc.Util.getInstance(Util.java:384) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494) 在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960) 在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114) 在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696) 在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105) 在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) 在org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ......还有16个
错误指向以下行的EventManager类:
List result = session.createQuery("from Event").list();
由于'hbm2ddl.auto'属性在配置xml中被赋予'create'值,Hibernate应该在每次运行时创建新表,但是,它没有这样做。请帮助解决问题。
提前致谢。
答案 0 :(得分:13)
尝试指定hibernate.hbm2ddl.auto=create
而不只是hbm2ddl.auto=create
。
这是documentation使用的内容。
答案 1 :(得分:1)
尝试使用<property name="hibernate.hbm2ddl.auto">create</property>
代替<property name="hbm2ddl.auto">create</property>