提问人:Enzo 提问时间:9/7/2021 更新时间:9/29/2021 访问量:78
OpenJPA - 如何使工作 strategy=Sequence against Oracle 和 strategy=Identity against MySql
OpenJPA - How to make work strategy=Sequence against Oracle and strategy=Identity against MySql
问:
我处理一个同时支持 Oracle 和 MySql 并由 openJPA 组成的应用程序。
问题
对于给定的实体,有一个列,该列是根据某些 generatedValue 填充的。对于db锁上的一些问题,我必须将其从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>
我试图用它来构建,但启动在某些错误中失败了,抱怨缺少映射。
我从这个问题中看到:用orm.xml(休眠)覆盖实体的仅 JPA 表生成器,我无法覆盖 JPA 实体的特定属性,而是必须报告所有映射。这也适用于 openJPA 吗?
给定相同的代码,我是否有机会使用:
- strategy=sequence,针对 oracle
- strategy=MySql 中的标识甚至表生成器(即使不推荐)
答:
您的第一个链接是使用 hibernate 作为 JPA 提供程序,并使用 ORM.xml覆盖注释,表明即使是 Hibernate 也可以做到这一点 - 您链接的问题特定于 hibernate 映射,因此与标准 JPA/orm.xml 处理无关。
OpenJPA 和任何 JPA 提供程序也应该用orm.xml中的内容覆盖注解。orm.xml强制忽略注解的唯一情况是将其标记为 xml-mapping-metadata-complete
评论