如何将JPA实体标识符映射到Oracle和MySQL上
目前,我正在将我的数据库从Oracle迁移到Mysql。在短暂的过渡期内,我希望支持这两个数据库。(至少从两者中读取) 我面临的主要挑战是关于主键生成如何将JPA实体标识符映射到Oracle和MySQL上,mysql,spring,oracle,hibernate,jpa,Mysql,Spring,Oracle,Hibernate,Jpa,目前,我正在将我的数据库从Oracle迁移到Mysql。在短暂的过渡期内,我希望支持这两个数据库。(至少从两者中读取) 我面临的主要挑战是关于主键生成 在Oracle中,我使用的是序列 @Id @SequenceGenerator(name=“MY_SEQ”,sequenceName=“MY_SEQ”,allocationSize=2) @GeneratedValue(策略=GenerationType.SEQUENCE,generator=“MY_SEQ”) 私人长id; 在Mysql中,我
@Id
@SequenceGenerator(name=“MY_SEQ”,sequenceName=“MY_SEQ”,allocationSize=2)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“MY_SEQ”)
私人长id;
@Id
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
是否有一种方法可以根据配置的数据库动态设置此策略?我不想为了这个目的而复制模型。当然,如果我正朝着次优方向前进,请告诉我 根据文档顺序,还应使用没有顺序的数据库 2.6.9。使用序列 用于实现基于数据库序列的标识符值生成 Hibernate利用它的 org.hibernate.id.enhanced.SequenceStyleGenerator id生成器。它是 重要的是要注意SequenceStyleGenerator能够工作 通过切换到 表作为基础支持。这给了Hibernate很大程度的灵活性 跨数据库的可移植性,同时仍保持一致的id 生成行为(相对于在序列和 身份)。此备份存储对用户完全透明 缺点是它不会使用MySQL自动增量,而是使用数据库表。
但是,既然您在有限的时间内需要它,为什么不这样做呢?当您不再需要Oracle切换到自动增量和标识时。首先,不要使用生成器,因为它对性能有害 因此,默认情况下应使用startegy:
@Entity(name = "Post")
@Table(name = "post")
public class Post {
@Id
@GeneratedValue(
generator = "sequence",
strategy = GenerationType.SEQUENCE
)
@SequenceGenerator(
name = "sequence",
allocationSize = 10
)
private Long id;
private String title;
//Getters and setters omitted for brevity sake
}
并使用XML映射将MySQL的序列
覆盖为标识
:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd"
version="2.1"
>
<package>com.vladmihalcea.book.hpjp.hibernate.identifier.global</package>
<entity class="Post" access="FIELD">
<attributes>
<id name="id">
<generated-value strategy="IDENTITY"/>
</id>
</attributes>
</entity>
</entity-mappings>
com.vladmihalcea.book.hpjp.hibernate.identifier.global
因此,当您构建MySQL工件时,您需要部署所提供的覆盖标识符策略的
orm.xml
。您有多少实体?@SimonMartinelli 100+是的,如果找不到更好的替代方案,我将保留它作为我的备用选项。谢谢