如何将JPA实体标识符映射到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中,我

目前,我正在将我的数据库从Oracle迁移到Mysql。在短暂的过渡期内,我希望支持这两个数据库。(至少从两者中读取)

我面临的主要挑战是关于主键生成

  • 在Oracle中,我使用的是序列
  • @Id
    @SequenceGenerator(name=“MY_SEQ”,sequenceName=“MY_SEQ”,allocationSize=2)
    @GeneratedValue(策略=GenerationType.SEQUENCE,generator=“MY_SEQ”)
    私人长id;
    
  • 在Mysql中,我使用自动增量(Oracle不支持)
  • @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+是的,如果找不到更好的替代方案,我将保留它作为我的备用选项。谢谢