【发布时间】:2014-12-11 22:39:28
【问题描述】:
我遇到了一个奇怪的问题,Java EE 应用程序运行在 Wildfly 8.1.0 作为服务器,Postgres 作为我们的数据库系统,并结合 EclipseLink 作为持久性提供程序(我想研究成本的原因从内置的 Hibernate 迁移到 EclipseLink 在这里无关紧要)。
在扩展相应的实体类时,我已经习惯了通过新添加的列自动扩展现有数据库表的 Hibernate 特性,如果 EclipseLink 也能够这样做,那就太棒了 - 研究文档,EclipseLink 提供了属性
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
这对我来说听起来不错,但一个简短的测试会导致幻灭的结果是它不能“开箱即用”(请参阅下面的最小示例)。有趣的是,如果我只是在没有任何列的数据库中创建相应的表,则该表将被填充并按我的意愿工作,但 create-or-extend-tables 和 drop-and-create-tables 甚至 create-tables 都不起作用 - 如果我只使用前两个添加提到的空表。
有没有人遇到过这样的情况并可能找到解决办法?
另外,我了解到一个关于事务的 Postgres 问题
如果发生错误,PostgreSQL 似乎会中止事务,因此在失败后访问数据库可能要等到调用回滚后才能访问。 (EclipseLink/FAQ/JPA/PostgreSQL)
由于某些错误日志指出事务存在问题,这可能是问题的一部分吗?
小例子
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="..." transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
Name.java
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Name {
private String id;
private String name;
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【问题讨论】:
-
我不明白为什么如果 create-tables 不存在空表存在,drop-and-create-tables 会起作用,因为 drop-and-create 将首先删除表,然后运行就像 create-tables 一样。您能否提供显示可能出现问题的日志? wiki.eclipse.org/EclipseLink/Examples/JPA/Logging
-
@Chris 我将日志级别设置为“ALL”并收到以下信息:pastebin.com/aKaCPRcH。我对您的论点的怀疑:我怀疑 EclipseLink 是检查表是否存在,而不是创建表并希望做到最好——而且我怀疑 EclipseLink 通过 SQL 查询检查是否存在,并且由于缺少表存在而导致查询失败,Postgres 显示了这种行为上面 wiki.eclipse.org/EclipseLink/FAQ/JPA/PostgreSQL 中提到并需要回滚 EclipseLink 不执行因此失败。
标签: hibernate postgresql jpa eclipselink wildfly