2010-12-20 52 views
8

在配置hibernate.cfg.xml中,我添加了 <property name="hibernate.hbm2ddl.auto">create</property> Hibernate在我運行應用程序時會自動創建表。但是,我通過運行drop table sql手動從表中刪除表。然後再次運行hibernate應用程序。唯一的例外出現休眠表不存在錯誤

產生的原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表「test.person」不存在

只解決這個問題的方法是重新啓動Mysql的數據庫。任何人都可以爲我解釋這個問題嗎?

這是我的hibernate.cfg.xml

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.driver_class"> 
     com.mysql.jdbc.Driver 
    </property> 
    <property name="hibernate.connection.url"> 
     jdbc:mysql://localhost/test 
    </property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 
    <property name="dialect"> 
     org.hibernate.dialect.MySQLDialect 
    </property> 


    <!-- Drop and re-create the database schema on startup --> 
    <property name="hibernate.hbm2ddl.auto">create</property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 

    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 

    <!-- Mapping files --> 
    <mapping resource="com/mapping/Event.hbm.xml" /> 
    <mapping resource="com/mapping/Person.hbm.xml"/> 
</session-factory> 

THX

+0

如何刪除表格?在應用程序或命令行?放棄後你是否停止了你的應用程序? – 2010-12-20 15:26:12

+0

Thx爲您的答覆。我通過運行命令行來刪除表,而不是在應用程序中。順便說一下,我只是發現,當我想通過應用程序創建表後,通過應用程序做另一個操作。拋出異常。任何線索? – EeE 2010-12-20 15:39:57

回答

11

我不相信使用create會更新就地架構以重新添加您刪除的表。試試:

<property name="hibernate.hbm2ddl.auto">update</property> 

這是創建一個模式,如果一個不存在,並嘗試修改現有的模式以匹配您定義的映射。

另外,請閱讀this question瞭解所有可能的值。

+0

是的,我更改爲更新。但問題仍然存在。我想重新添加表格,但繼續扔「表'test.person'不存在」;該表是假設自動添加的。然後我必須重新啓動我的SQL服務器。然後我可以添加表格。我想我在事務之後運行commit()和close()。但在第一次操作後創建一個表,它會一直拋出「Table」test.person'不存在「的異常。 – EeE 2010-12-20 16:15:04

+0

不要丟下桌子?如果您想刪除數據,請使用DELETE FROM。 – OrangeDog 2010-12-20 17:13:39

+2

更好的是,如果您只想刪除表中的所有行,請使用TRUNCATE TABLE test.person。 – Jeshurun 2011-08-03 17:07:08

5

有 「產權」 和 「名」 之間的空間?

<propertyname="hibernate.hbm2ddl.auto">create</property> 

如果沒有,那麼這可能是問題。另外,當你「重新啓動MySQL數據庫」時,它是什麼意思呢?這是否意味着您只需重新啓動MySQL服務器,或者這意味着您需要手動重新創建表?另外,如果上面的XML摘錄確實包含「property」和「name」之間的空格,請提供除了hibernate日誌之外的所有內容,特別是它列出了它標識的所有屬性的部分。

+0

順便說一句,我說的日誌條目如下所示:01:30:08,032信息環境:540 - 從資源hibernate.properties加載的屬性:{url = jdbc:hsqldb:hsqldb/hibernate,hibernate.connection .driver_class = org.hsqldb.jdbcDriver,hibernate.cache.provider_class = org.hibernate.cache.HashtableCacheProvider,schema =,hibernate.cache.use_query_cache = true,hibernate.dialect = org.hibernate.dialect.HSQLDialect,username = sa, hibernate.jdbc.use_streams_for_binary = true ... – jpkrohling 2010-12-20 15:30:06

+0

對不起,我輸了。當異常拋出時,我重新啓動MySQL服務器。但是,我應用程序創建表後。我想運行更多的操作,例如讀取,更新操作。 「表'test.person'不存在」異常拋出 – EeE 2010-12-20 15:42:26

+0

您可以嘗試從屬性名稱中刪除「hibernate」前綴嗎? IIRC,它對於cfg.xml文件無效,並且只需要.properties文件。另外,請 – jpkrohling 2010-12-20 16:03:07

2

我有這個相同的問題。我觀察到我正在使用auto_increment(我使用的是MySQL方言)來處理String字段。我將其更改爲int,從而解決了問題

+0

我今天遇到了同樣的問題,問題使用SQLException是它只顯示一個表不存在,不告訴你爲什麼不能創建表(Hibernate配置,列類型...)。 – Yassir 2017-11-10 11:52:32