Java Oracle:@GeneratedValue注释情况下如何生成主键id
所以我有一个repository类,在其中我可以看到主键字段有一个注释Java Oracle:@GeneratedValue注释情况下如何生成主键id,java,oracle,hibernate,jpa,annotations,Java,Oracle,Hibernate,Jpa,Annotations,所以我有一个repository类,在其中我可以看到主键字段有一个注释 @Id @生成值 因此,我所知道的是,当没有明确定义策略时,默认策略集是自动的。 在自动策略的情况下,数据库从以下方面决定策略:序列、表、标识 所以,我的数据库是Oracle,对于Oracle来说,顺序是最首选的策略 如果我错了,请纠正我 我的问题是如何知道我的表使用的是哪种策略,是顺序,如果是顺序,是表特定的还是通用的 这个序列是否确保新id大于最大id 我是这个领域的新手,无法找到任何有用的资源来理解这一点 提前感谢您
@Id
@生成值
因此,我所知道的是,当没有明确定义策略时,默认策略集是自动的。
在自动策略的情况下,数据库从以下方面决定策略:序列、表、标识
所以,我的数据库是Oracle,对于Oracle来说,顺序是最首选的策略
如果我错了,请纠正我
我的问题是如何知道我的表使用的是哪种策略,是顺序,如果是顺序,是表特定的还是通用的
这个序列是否确保新id大于最大id
我是这个领域的新手,无法找到任何有用的资源来理解这一点
提前感谢您的帮助。:) 如果您配置了ddl auto,我很确定这是特定于表的序列。 在Google中搜索JPA,可以找到一堆关于该主题的文章,如: 顺序策略 序列策略包括两部分:定义命名序列和在一个或多个类的一个或多个字段中使用命名序列。@SequenceGenerator注释用于定义序列并接受名称、初始值(默认值为1)和分配大小(默认值为50)。序列是应用程序的全局序列,可由一个或多个类中的一个或多个字段使用。序列策略在@GeneratedValue注释中用于将给定字段附加到先前定义的命名序列:
@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不同,序列策略在新实体对象被持久化后(即提交前)立即生成一个自动值。这在较早需要主键值时可能很有用。为了最大限度地减少到数据库服务器的往返,将按组分配ID。每个分配中的ID数由allocationSize属性指定。可能不会使用给定分配中的某些ID。因此,该策略不能保证序列值中不会有间隙
表格策略
表策略与顺序策略非常相似:
@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没有表,因此表和序列策略几乎相同
一个微小的差异与初始值属性有关。序列策略维护下一个要使用的序列号,而表策略维护最后使用的值。initialValue属性的含义是,如果希望表中的序号以1开头,则必须在@SequenceGenerator注释中指定initialValue=0
或:
即使这篇文章解释了序列策略在基准代码段中的性能也是最好的:
如果您的堆栈是SpringDataJPA,那么他们有一个关于pivotal的非常好的文档。
这与其说是回答,不如说是评论。如果有文档,那么您应该找到它并引用相关部分(以便信息保留在StackOverflow上),并添加页面链接(以便人们可以查看主要来源)。