使用Wildfly,EclipseLink和Postgres自动创建和/或扩展JPA表

时间:2014-10-16 14:06:57

标签: hibernate postgresql jpa eclipselink wildfly

我遇到一个奇怪的问题,在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-tablesdrop-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;
    }
}

1 个答案:

答案 0 :(得分:3)

您在日志中有许多例外,这些都是由于使用JTA数据源并且是事务的一部分。有关详细信息,请参阅eclipse.org/forums/index.php/t/440610,但DDL在大多数事务中都不起作用,因此您需要通过“eclipselink.deploy-on-startup”触发EclipseLink预先加载持久性单元“=”true“持久性属性。