2014-09-22 47 views
0

我使用hibernate作爲ORM工具是我的項目。它對我以前的工作很好,並正確創建表。我的最後一個表有大約200列,經過一些改變,現在我的表需要150列。所以我編輯了我的映射pojo類.Hb2ddl從中刪除了額外的屬性和getters setter。正如我可以看到drop table,在我的控制檯上創建表語法。但由hibernate生成的新表也包含一些舊的列模式值,這些舊的列模式值沒有被使用並且不存在於映射的pojo中?與Hibernate混淆hbm2ddl.auto

爲了檢查目的,當我改變pojo名稱,然後它生成150列的rigth表。

已經爲第一個條件添加了圖片。下面的mir_ids的值來自舊schema.I在我的映射pojo中沒有使用它們。

此搜索:enter image description here

當檢查我嘗試pojo.It我得到正確的輸出不同的充名字(這些都是166行)

鏡像2:

enter image description here

那些額外的價值是不存在的,並且工作完全罰款。但我不想這樣做,我需要討論ge表名在所有項目中。

可能是什麼原因呢?如何糾正?

注意:我已編輯映射類名,它爲我工作。我得到了一個新的表,創建了151柱,因爲我需要,但休眠仍然創建舊錶本身。即使沒有映射在休眠.cfg.xml文件。

代碼hibernate.cfg.xml文件:

<property name="hibernate.connection.autocommit">false</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">abhijeet</property> <property 
     name="hibernate.connection.url">jdbc:mysql://localhost:3306/jdbctest</property> 
     <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <property name="hibernate.connection.pool_size">1</property> 
<!-- <property name="hibernate.connection.datasource">jdbc/mysql_pool1</property> --> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.hbm2ddl.auto">create-drop</property> 
    <mapping class="com.abhijeet.nabi.pojos.TablePojo" /> 

爲什麼休眠創建一個額外的表,對此我沒有任何映射。

+0

你對財產hbm2ddl.auto有什麼價值?驗證|更新|創建| create-drop – shazin 2014-09-22 09:40:19

+0

我每次創建新表時都使用'create'.Works。但是某些ols模式值不會被刪除。 – 2014-09-22 09:42:28

+0

@AbhijeetPanwar does [this](http://stackoverflow.com/questions/438146/hibernate-hbm2ddl-auto-possible-values-and-what-they-do)可以幫助你 – 2014-09-22 10:15:57

回答

1

我假設通過使用create選項,當結構發生變化時,您可以運行混合表格 - 當您更改表格名稱時,會創建一個新表格,並且工作正常。因此,在開發過程中,您應該使用選項create-drop - 以您確定的方式每次都有正確的表格。

在整合和當然生產過程中,您應該使用validate,並分別創建模式。


更新:

我認爲這個問題是Hibernate和JPA配置的組合。

您沒有指定您使用的Java EE版本,但由於它是Java EE,您確實有JPA可用,只要您沒有使用Hibernate的任何專有API,就沒有必要擁有一個hibernate.cfg.xml,但只有一個persistence.xml(見here)。

此外,您不需要列出所有想要映射的類,但使用自動檢測,因此它會自動使用所有帶註釋的實體。

您也可以查看Java EE 7 tutorial的章節。

+0

感謝您的答覆。已編輯的代碼。使用了create-drop代替,但現在我可以看到更尷尬的事情了。當我執行desc tablename;它顯示了151列,正如我所期待的那樣。然後我再次做了desc表名,但它顯示了153,再多一次,數量達到了155.而不是它188.現在我更加困惑了。 – 2014-09-22 10:47:12

+0

@AbhijeetPanwar:你如何部署你的應用程序?它是否在IDE中,它使用Maven還是手動複製文件?並且您是否使用其他配置,如映射文件?嘗試徹底清除部署並重新啓動。 'drop-create'應該總是遍歷所有的實體並且創建它們(如果啓用,你可以在休眠日誌中看到它)。除此之外,您可以在開發過程中始終使用'validate'機制 - 我們這樣做是爲了保留已存在於數據庫中的數據,並隻手動調用更新模式的db重置腳本。 – 2014-09-22 10:59:19

+0

是的。它是在IDE中。我沒有使用maven。創建刪除工作正常。剛部署後,它顯示了151列,因爲我期待,但隨後它添加了舊的表格架構.Strange.afer幾分鐘它添加舊的模式值也與新表的模式:( – 2014-09-22 11:02:20