如何解决Oracle:在@GeneratedValue注释的情况下,如何生成主键ID
所以我有一个存储库类,在其中可以看到主键字段带有注释
@Id
@GeneratedValue
因此,我知道,当未明确定义策略时,默认策略集为auto。 在自动策略的情况下,破坏数据库从以下各项中决定策略:顺序,表,标识。
因此,我的数据库是Oracle,如果是Oracle,则最优先选择策略。
如果我错了,请纠正我。
我的问题是我如何知道我的表使用哪种策略,它是序列的,如果是序列的,是表特定的还是通用的。
并且此序列确保新ID大于最大ID。
我在这个领域还很陌生,无法找到任何有用的资源来理解这一点。
非常感谢您的帮助。 :)
解决方法
如果您配置了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/
如果您的堆栈是spring-data-jpa,则它们具有关于数据透视的很好的文档。 https://spring.io/projects/spring-data-jpa
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。