【问题标题】:Automatically creating and/or extending JPA tables with Wildfly, EclipseLink and Postgres使用 Wildfly、EclipseLink 和 Postgres 自动创建和/或扩展 JPA 表
【发布时间】: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-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;
    }
}

【问题讨论】:

  • 我不明白为什么如果 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


【解决方案1】:

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

【讨论】:

  • 论坛链接与EclipseLink无关,但添加的属性完美地完成了工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多