我遇到一个奇怪的问题,在Wildfly 8.1.0上运行的Java EE应用程序作为服务器,Postgres作为我们的数据库系统与EclipseLink一起作为持久性提供程序(我想研究成本的原因)从内置的Hibernate迁移到EclipseLink并不重要。
我已经习惯了在扩展相应的Entity类时通过新添加的列自动扩展现有数据库表的Hibernate功能,如果EclipseLink能够这样做,它也很有吸引力 - 研究文档,EclipseLink提供了属性
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
这对我来说听起来不错,但是一个简短的测试会导致失败的结果,它不起作用&#34;开箱即用&#34; (见下面的最小例子)。有趣的是,如果我只是在没有任何列的数据库中创建相应的表,表格将被填充并按我的意愿工作,但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;
}
}
答案 0 :(得分:3)
您在日志中有许多例外,这些都是由于使用JTA数据源并且是事务的一部分。有关详细信息,请参阅eclipse.org/forums/index.php/t/440610,但DDL在大多数事务中都不起作用,因此您需要通过“eclipselink.deploy-on-startup”触发EclipseLink预先加载持久性单元“=”true“持久性属性。