我有一个目前在 JBoss 6 上运行(没有问题)的应用程序,我正在尝试升级以在 WildFly 10.1 上运行。大部分升级进展顺利。但是,从 Hibernate 3.4(在 JBoss 6 上)升级到 Hibernate 5.1(在 WildFly 10.1 上)会导致一些问题。
具体来说,在我的 persistence.xml 中,我包含以下属性。
<property name="hibernate.hbm2ddl.auto" value="update"/>
请注意:作为升级的一部分,我不会进行任何架构或其他数据库更改。此外,我指的是已在 JBoss 6/Hibernate 3.4 实例下成功运行的同一个数据库实例。因此,我相信包含此属性在首次使用 WildFly 10.1/Hibernate 5.1 版本运行时应该没有实际工作/更新要做。
但是,包含此属性似乎 1) 错误地确定它需要进行更新,并且 2) 无法成功进行更新。它导致以下堆栈跟踪:
Failed to start service jboss.persistenceunit."app.ear#PU": org.jboss.msc.service.StartException in service jboss.persistenceunit."PU": javax.persistence.PersistenceException: [PersistenceUnit: PU] Unable to build Hibernate SessionFactory
...
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: PU] Unable to build Hibernate SessionFactory
...
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to execute schema management to JDBC target [create index company_id_index on APPROVER (COMPANY_ID)]
...
Caused by: org.postgresql.util.PSQLException: ERROR: relation "company_id_index" already exists
同样,有问题的表和索引已经存在(由最终错误确认)。
Hibernate 现在是否不再区分大小写(COMPANY_ID_INDEX 不同于 company_id_index)?
如果是这样,我如何配置它以使其像以前一样不区分大小写(Postgres 默认所有这些都降低......)
TIA!
最佳答案
呸!打脸掌!我最近发现在使用 Hibernate 3.4/JBoss 6 创建 hbm2ddl 索引时也会发生类似的错误,因为我现在正在使用 Hibernate 5.1/Wildfly 10.1;但是,它们并没有阻止持久性模块的成功启动。本质上,他们只是被巧妙地压制了。我不确定这是否是与 Hibernate 版本相关的预期更改,因为它们会阻止它在 Hibernate 5.1/Wildfly 10.1 中启动?
这里的根本问题原来是索引名称在 Postgres 的整个模式中必须是唯一的。因此,多个实体中的每个实体都具有 COMPANY_ID 列的 FK,每个实体都必须具有唯一的索引名称。索引是 Postgres 中的关系(驱动跨模式需求的唯一性)。
感谢您的建议,对造成的困惑深表歉意。
关于postgresql - Hibernate 3.4 到 5.1 迁移的 hibernate.hbm2ddl.auto 值 ="update"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335946/