2013-08-21 50 views
0

我正在一個項目上工作,遇到了一個相當莫名其妙的問題。休眠模式生成:相同的配置,不同的行爲

一些上下文:該項目是一個相當標準的Java 7項目,使用Maven 3.0.4作爲構建工具,使用spring(3.2.3.RELEASE)進行依賴注入。 Hibernate(4.1.12.Final)用於持久化。

當運行持久性相關的單元測試(使用Spring的AbstractTransactionalJUnit4SpringContextTests)時,架構是在僅爲測試創建的臨時數據庫中創建的(使用hibernate的hibernate.hbm2ddl.auto = update屬性)。

這對我的開發機器(Linux Mint 12)非常有用。 但是,當我在我的筆記本電腦上運行完全相同的代碼(最近安裝Linux Mint 15)時,我發現休眠是而不是創建任何外鍵

這是特別奇怪,因爲:

  • 我正在從頭開始建立完全相同的軟件(相同結賬)使用完全相同的Maven版本
  • (清除回購的.m2)(3.0.4)
  • 具有相同Spring和Hibernate版本
  • 使用幾乎相同PostgreSQL數據庫(包9.1.9-0ubuntu11.10版本工作的機器上(因爲這些在行家構建配置與源代碼簽出配置),9.1.9 -1ubuntu1 lapt OP),其中有完全相同的配置(除了區域設置)
  • 數據庫使用的是Postgres的超級用戶訪問,因此權限都不是問題

通常情況下我做得不錯,在得到的任何奇怪問題的根源,但這絕對讓我困惑。我看不到任何可能導致此問題的相關差異... 任何導致如何找到此原因將不勝感激!

我可以看到2條可能的線索對於這個問題:

  • 我撥弄與周圍的筆記本電腦上的區域設置了一下,可這在某種程度上導致此問題?
  • 在下面的Hibernate屬性中,可以看到使用PostgreSQL82Dialect。我發現this Hibernate forum thread其中提到以下幾點:

我看見你正在使用ProgressDialect這種方言不支持表的改變(ProgressDialect.hasAlterTable()返回false)。

這似乎是最可能導致這個問題,但是後來我仍然不明白爲什麼它的工作原理上的一個設置,而不是其他的,因爲Hibernate的配置對相同...

一些額外的信息:

休眠配置(雖然這兩個設置是相同的!):

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" /> 
    <property name="persistenceUnitManager" ref="jpaPersistenceUnitManager" /> 
    <property name="jpaDialect" ref="hibernateJpaDialect" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 
      <prop key="hibernate.cache.use_minimal_puts">false</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.cache.use_structured_entries">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop> 
      <prop key="hibernate.generate_statistics">false</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.jdbc.use_get_generated_keys">false</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="net.sf.ehcache.configurationResourceName">/ehcache-unity-persistence.xml</prop> 
     </props> 
    </property> 
</bean> 

隨意請求更多的信息,如果你認爲它可以幫助! 或者如果你想我檢查/嘗試一些東西,讓我知道!

這真讓人討厭!

+1

我不確定,但如何檢查日誌?您將在那裏獲得有價值的信息 –

+1

您可以啓用Hibernate日誌並檢查是否有任何異常 –

+0

不知道。但是,也許您可​​以使用ShemaExporter將數據庫更新導出到.sql文件,並且看到此問題仍然存在。如果是的話,你可以在Hiberante源代碼上放一些中斷點,並試圖找出它。 – Rafa

回答

1

好吧,來自HoàngLong的提示看看日誌讓我回答: 顯然我的數據庫剛剛損壞。

除了用於創建外鍵約束的'ALTER TABLE'語句之外,所有東西都能正常工作,這會導致錯誤。

顯然我的postgresql安裝被搞砸了......