我正在开发一个必须部署在多个环境中的应用程序,使用不同的RDBMS,即MySQL,MariaDB和Oracle。这意味着不同的ID生成模式(自动递增与序列)。
JPA应该允许从RDBMS中抽象。但是,我不知道如何配置@Id
字段,以便它可以同时使用自动增量和序列。
// Auto-increment
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Sequence
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
答案 0 :(得分:0)
有关信息,我找到了答案,似乎有些公司遇到了同样的困难。答案当前可用here。
主要思想是:
SEQUENCE
生成策略设计实体; 之所以可能是因为:
XML元数据可以用作这些注释的替代,或覆盖或扩充注释
— JPA 2.1规范,对象/关系映射的11.1注释
例如,引用我上面链接的文章的示例,则实体为:
@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 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>
有关技术方面以及为何不使用AUTO
策略的更多信息,请参阅the article。