有没有一种方法可以使用@generatedvalue,这样它就可以同时使用sequence和auto increment?

yruzcnhs  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(390)

我正在开发一个应用程序,它必须部署在多个环境中,使用不同的rdbms,即mysql、mariadb和oracle。这意味着不同的id生成模式(自动递增vs序列)。
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;
klr1opcd

klr1opcd1#

作为参考,我找到了一个答案,似乎有些公司也遇到了同样的困难。答案目前可以在这里找到。
主要思想是:
使用 SEQUENCE 发电策略;
提供一个jpa-xmlMap文件,覆盖基于java的注解Map;
在使用mysql(或其他序列不兼容的rdbms)运行时加载此Map文件。
这是可能的,因为:
xml元数据可以作为这些注解的替代品,也可以用来覆盖或扩充注解
-JPA2.1规范,11.1对象/关系Map注解
例如,引用上文我所链接的文章的例子,该实体将是:

@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
}

Map文件是:

<?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 策略,请参考文章。

相关问题