我正在一个项目上工作,遇到了一个相当莫名其妙的问题。休眠模式生成:相同的配置,不同的行为
一些上下文:该项目是一个相当标准的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>
随意请求更多的信息,如果你认为它可以帮助! 或者如果你想我检查/尝试一些东西,让我知道!
这真让人讨厌!
我不确定,但如何检查日志?您将在那里获得有价值的信息 –
您可以启用Hibernate日志并检查是否有任何异常 –
不知道。但是,也许您可以使用ShemaExporter将数据库更新导出到.sql文件,并且看到此问题仍然存在。如果是的话,你可以在Hiberante源代码上放一些中断点,并试图找出它。 – Rafa