【问题标题】:Oracle : How primary key id is generated in case of @GeneratedValue annotationOracle:在@GeneratedValue 注释的情况下如何生成主键ID
【发布时间】:2020-09-29 07:13:20
【问题描述】:

所以我有一个存储库类,我可以在其中看到主键字段有一个注释

@Id
@GeneratedValue

所以,我知道当策略没有明确定义时,默认策略集是自动的。 在自动策略的情况下,破坏数据库从以下方面决定策略:序列、表、身份。

所以,我的数据库是Oracle,如果是Oracle,顺序是最优选的策略。

如果我错了,请纠正我。

我的问题是我如何知道我的表使用了哪种策略,它是顺序的,如果是顺序,它是特定于表的还是通用的。

这个序列是否确保新的 id 大于 max id。

我是这个领域的新手,无法找到任何有用的资源来理解这一点。

提前感谢您的帮助。 :)

【问题讨论】:

    标签: java oracle hibernate jpa annotations


    【解决方案1】:

    如果您配置了 ddl auto,我很确定它是特定于表的序列。 在 Google 中搜索 JPA 以查找有关该主题的大量文章,例如:

    https://www.objectdb.com/java/jpa/entity/generated

    顺序策略

    序列策略由两部分组成 - 定义命名序列和在一个或多个类的一个或多个字段中使用命名序列。 @SequenceGenerator 注解用于定义序列并接受名称、初始值(默认为 1)和分配大小(默认为 50)。序列对于应用程序来说是全局的,并且可以被一个或多个类中的一个或多个字段使用。 @GeneratedValue 注解中使用 SEQUENCE 策略将给定字段附加到先前定义的命名序列:

    @Entity
    // Define a sequence - might also be in another class:
    @SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
    public class EntityWithSequenceId {
        // Use the sequence that is defined above:
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
        @Id long id;
    }
    

    与 AUTO 和 IDENTITY 不同,SEQUENCE 策略会在新实体对象被持久化后(即在提交之前)立即生成一个自动值。当更早需要主键值时,这可能很有用。为了尽量减少到数据库服务器的往返次数,ID 被分组分配。每个分配中的 ID 数量由 allocationSize 属性指定。给定分配中的某些 ID 可能不会被使用。因此,此策略并不能保证序列值中不会有空缺。

    餐桌策略

    TABLE 策略与 SEQUENCE 策略非常相似:

    @Entity
    @TableGenerator(name="tab", initialValue=0, allocationSize=50)
    public class EntityWithTableId {
        @GeneratedValue(strategy=GenerationType.TABLE, generator="tab")
        @Id long id;
    }
    

    基于 ORM 的 JPA 提供程序(例如 Hibernate、TopLink、EclipseLink、OpenJPA、JPOX 等)使用表模拟序列以支持此策略。 ObjectDB 没有表,所以 TABLE 和 SEQUENCE 策略几乎相同。

    一个微小的差异与初始值属性有关。 SEQUENCE 策略维护下一个要使用的序列号,而 TABLE 策略维护最后使用的值。 initialValue 属性的含义是,如果您希望序列号在 TABLE 策略中以 1 开头,则必须在 @SequenceGenerator 注释中指定 initialValue=0。

    或: https://vladmihalcea.com/why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate/

    即使是这篇解释序列策略的文章在基准代码 sn-ps 上也有最好的性能:https://vladmihalcea.com/why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate/

    如果您的堆栈是 spring-data-jpa,他们有一个非常好的关于关键的文档。 https://spring.io/projects/spring-data-jpa

    【讨论】:

    • 这更像是一个评论而不是一个答案。如果那里有文档,那么您应该找到它并引用相关部分(以便将信息保留在 StackOverflow 上)并添加指向页面的链接(以便人们可以查看主要来源)。
    猜你喜欢
    • 2018-04-29
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2011-09-02
    • 2021-04-28
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多