Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle:@GeneratedValue注释情况下如何生成主键id_Java_Oracle_Hibernate_Jpa_Annotations - Fatal编程技术网

Java Oracle:@GeneratedValue注释情况下如何生成主键id

Java Oracle:@GeneratedValue注释情况下如何生成主键id,java,oracle,hibernate,jpa,annotations,Java,Oracle,Hibernate,Jpa,Annotations,所以我有一个repository类,在其中我可以看到主键字段有一个注释 @Id @生成值 因此,我所知道的是,当没有明确定义策略时,默认策略集是自动的。 在自动策略的情况下,数据库从以下方面决定策略:序列、表、标识 所以,我的数据库是Oracle,对于Oracle来说,顺序是最首选的策略 如果我错了,请纠正我 我的问题是如何知道我的表使用的是哪种策略,是顺序,如果是顺序,是表特定的还是通用的 这个序列是否确保新id大于最大id 我是这个领域的新手,无法找到任何有用的资源来理解这一点 提前感谢您

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

@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上),并添加页面链接(以便人们可以查看主要来源)。