2013-08-21 55 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安装被搞砸了......