【发布时间】: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