【问题标题】:OpenJPA - How to make work strategy=Sequence against Oracle and strategy=Identity against MySqlOpenJPA - 如何制定工作策略=针对 Oracle 的序列和策略=针对 MySql 的身份
【发布时间】:2023-09-20 22:13:01
【问题描述】:

我处理一个同时支持 Oracle 和 MySql 并使用 openJPA 的应用程序。

问题

对于给定的实体,有一个基于某个生成值填充的列。对于数据库锁的一些问题,我必须将它从 tableGenerator 转换为 sequenceGenerator。这对 Oracle 效果很好:

@Override
@Basic
@Column(name = "ORDER_NUMBER", length = GUID_LENGTH, nullable = false, unique = true)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ORD_SEQ")
@SequenceGenerator(sequenceName = "ORDERNUMBER", allocationSize = 1, name = "ORD_SEQ")
public String getOrderNumber() {
    return orderNumber;
}

当然它对 mySql 不起作用,因为它不支持序列对象。

然后我在这里浏览了这篇文章:https://vladmihalcea.com/how-to-replace-the-table-identifier-generator-with-either-sequence-or-identity-in-a-portable-way/,它建议仅在针对 mySql 完成构建并覆盖那里的属性时才加载 orm 文件,例如:

<entity class="com.ecommerceAppName.extensions.domain.cartorder.impl.ExtCartOrderImpl" metadata-complete="false" access="PROPERTY">
    <attributes>
        <id name="orderNumber">
            <generated-value strategy="IDENTITY"/>
        </id>
    </attributes>
</entity>

我尝试使用它进行构建,但启动时出现了一些错误,抱怨缺少映射。

我从这个问题中看到:Override JPA only Table Generator of Entity with orm.xml (Hibernate) 我不能覆盖 JPA 实体的特定属性,而是必须报告所有映射。这对 openJPA 也有效吗?

给定相同的代码,我是否有机会使用:

  • strategy=sequence,针对 oracle
  • strategy=MySql 中的标识甚至表生成器(即使不推荐)

【问题讨论】:

    标签: mysql oracle sequence openjpa


    【解决方案1】:

    您的第一个链接是使用 hibernate 作为 JPA 提供程序并使用 ORM.xml 覆盖注释,表明即使 Hibernate 也可以做到 - 您链接的问题特定于 hibernate 映射,因此与标准 JPA/orm.xml 无关处理。

    OpenJPA 和任何 JPA 提供者也应该使用 orm.xml 中的内容覆盖注释。 orm.xml 强制注释被忽略的唯一情况是它被标记为 xml-mapping-metadata-complete

    【讨论】:

      最近更新 更多