有没有办法使用@GeneratedValue,以便它可以用于序列和自动增量?

时间:2018-06-13 16:02:53

标签: mysql oracle jpa mariadb

我正在开发一个必须部署在多个环境中的应用程序,使用不同的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;

1 个答案:

答案 0 :(得分:0)

有关信息,我找到了答案,似乎有些公司遇到了同样的困难。答案当前可用here

主要思想是:

  1. 使用SEQUENCE生成策略设计实体;
  2. 提供一个覆盖基于Java的注释映射的JPA XML映射文件;
  3. 在与MySQL(或其他与序列不兼容的RDBMS)一起运行时,加载此映射文件。

之所以可能是因为:

  

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