2012-05-28 55 views
4

我正在處理我的first simple Hibernate application。問題的癥結在於,我重新命名了持久類的成員(對所有其他部分進行了適當更改),然後重新運行該應用程序。由於'hbm2ddl.auto'屬性在配置xml中被分配了'create'值,所以Hibernate需要在每次運行時創建一個新表,但它並沒有這樣做。以下是詳細信息:Hibernate'hbm2ddl.auto'屬性值'create'不是重新創建表

類:

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類中)。沒有錯誤。但是,當我嘗試運行應用程序時,我看到以下情況除外:

Exception in thread "main" org.hibernate.exception.SQLGrammarException: Unknown column 'event0_.title1' in 'field list' at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) at 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) at $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) at org.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) at org.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) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'event0_.title1' in 'field list' 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) 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) at com.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) at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ... 16 more

的錯誤是在下面的行指向eventmanager進行等級:

List result = session.createQuery("from Event").list(); 

由於「hbm2ddl.auto」財產分配「在配置xml中創建'value',Hibernate有望在每次運行時創建一個新表,但它並不這樣做。請幫助解決問題。

在此先感謝。

回答

12

嘗試指定hibernate.hbm2ddl.auto=create而不是僅僅hbm2ddl.auto=create

這是documentation使用的內容。

+0

亞歷克斯1/2:感謝很多爲這有助於跟蹤問題的響應。我嘗試了你的建議,但是,我看到了同樣的例外。這次我仔細查看了整個日誌記錄,並注意到下面幾行: 錯誤:HHH000389:失敗:丟棄表(如果存在)事件 錯誤:無法刪除或更新父行:外鍵約束失敗 – user1418717

+0

Alex,2/2 :所以,最後一個錯誤陳述清楚地指出了我之前忽略的問題。當我使用 示例時,我創建了與EVENTS表有許多關係的PERSON表,該表成功。然後,我試圖通過在OP中提到的操作來更改'title'成員,並在PERSON表的配置文件中評論映射條目。 Hibernate報告了錯誤,但我忽略了。由於我是新成員,我不能投票,否則,我肯定會完成。無論如何,再次感謝。 – user1418717

+2

但是,如果您使用create,那麼您可能會丟失數據,因爲它可能會丟失當前數據。更新應該工作。 –

1

嘗試的<property name="hibernate.hbm2ddl.auto">create</property>代替<property name="hbm2ddl.auto">create</property>