Hibernate模式生成:相同的配置,不同的行为



我正在做一个项目,遇到了一个非常令人困惑的问题。

一些上下文:该项目是一个相当标准的Java7项目,使用Maven3.0.4作为构建工具,使用spring(3.2.3.REASE)进行依赖注入。Hibernate(4.1.12.Final)用于持久性。

当运行与持久性相关的单元测试(使用Spring的AbstractTransactionalJUnit4SpringContextTest)时,将在仅为测试创建的临时数据库中创建架构(使用hibernate的hibernate.hbm2ddl.auto=update属性)。

这一切在我的开发机器(Linux Mint 12)上运行得很好。然而,当在我的笔记本电脑上运行完全相同的代码(最近安装了Linux Mint 15)时,我发现Hibernate没有创建任何外键。

这尤其奇怪,因为:

  • 我正在运行从头开始构建的完全相同的软件(完全相同的结账)(cleared.m2 repo)
  • 使用完全相同的Maven版本(3.0.4)
  • 具有相同的Spring和Hibernate版本(因为这些版本是在使用源代码签出的maven构建配置中配置的)
  • 使用几乎相同的Postgresql数据库(工作机器上的软件包版本为9.1.9-0ubuntu1.10,笔记本电脑上为9.1.9-1ubuntu1),它们具有完全相同的配置(除了区域设置)
  • 数据库是使用postgres超级用户访问的,所以权限不是问题

通常情况下,我很善于找出任何奇怪问题的根源,但这绝对让我感到困惑。我看不出任何可能导致这种情况的相关差异。。。任何关于如何找到原因的线索都将不胜感激!

我可以看到这个问题的两个可能的线索:

  • 我在笔记本电脑上摆弄了一些地方,这会不会以某种方式导致这个问题
  • 在下面的Hibernate属性中,您可以看到使用了PostgreSQL82方言。我发现这个Hibernate论坛帖子提到了以下内容:

我看到您使用的是ProgressDialect,而此方言不支持更改表(ProgressDiamet.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>

如果您认为有帮助,请随时请求更多信息!或者,如果你想让我检查/尝试一下,请告诉我!

这真让我讨厌!

好吧,Hoàng Long查看日志的提示让我找到了答案:显然我的数据库已经损坏了。

除了用于创建外键约束的"ALTERTABLE"语句外,所有操作都将完美运行,该语句将失败并出现错误。

显然我的postgresql安装搞砸了。。。

最新更新