当前位置: 首页 > 知识库问答 >
问题:

HiberNate序列nextVal已解决但未使用(Oracle)

钮瀚
2023-03-14

Hibernate没有像预期的那样从Oracle序列中分配对象id。以下是我在Hibernate调试日志中看到的内容。

DEBUG o.h.SQL:92 - select MY_SEQ.nextval from dual
DEBUG o.h.i.e.SequenceStructure:102 - Sequence value obtained: 22643
DEBUG o.h.r.j.i.ResourceRegistryStandardImpl:73 - HHH000387: ResultSet's statement was not registered
DEBUG o.h.e.i.AbstractSaveEventListener:118 - Generated identifier: 22594, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator

第一个“获得的序列值”是正确的,22643来自MY_SEQ。nextVal</code>。但是,使用的“生成的标识符”是22594?

我曾尝试调整发电机策略,但没有成功。

@Id
@SequenceGenerator(name = "generator", sequenceName = "MY_SEQ")
@GeneratedValue(generator = "generator", strategy = GenerationType.SEQUENCE)
@Column(name = "MY_ID", nullable = false, precision = 6, scale = 0)
private Integer id;

如果有帮助的话,我可以包含我的Spring Hibernate上下文配置。我没看到任何明显相关的东西。

Hibernate与 Oracle 序列不使用它很可能是相关的,但这处理间隙,而我得到的 id 小于获得的序列值。

PS:其他问题讨论优化效率的序列生成器策略。该数据的单个记录大约每月插入一次,并且只能从该类中插入。因此,效率在这里并不重要。

我也能够在 Oracle 仿真模式下在 HSQLDB 中重新创建它。所以这肯定是一个Hibernate问题。

偏移量始终正好为 49。上面的示例正确地从序列中获取了 22643,但随后将 22594 解析为下一个值。

22643-22594=49

另一个例子,下一个序列值实际上是4,Hibernate给了我-45。

4-(-45)=49

后续插入不会调用 Oracle 序列的 nextVal。我怀疑 JPA/Hibernate 正试图提前批量获取 ID 以提高效率。

DEBUG o.h.SQL:92 - select MY_SEQ.nextval from dual
DEBUG o.h.i.e.SequenceStructure:102 - Sequence value obtained: 22643
DEBUG o.h.r.j.i.ResourceRegistryStandardImpl:73 - HHH000387: ResultSet's statement was not registered
DEBUG o.h.e.i.AbstractSaveEventListener:118 - Generated identifier: 22594, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
...
DEBUG o.h.e.i.AbstractSaveEventListener:118 - Generated identifier: 22595, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator

共有1个答案

陶原
2023-03-14
匿名用户

正如我在第三次更新中提到的,JPA从前面的序列中“获取50个id”,并在内存中对它们进行计数以提高效率。

此行为由 javax.persistence.SequenceGenerator.allocationSize 指定,默认为 50。

(可选)从序列中分配序列号时要增加的量。

这对我或其他人来说一点都不直观,因为我的Oracle数据库序列应该定义这种行为,而50不是那里的标准默认值。

快速而肮脏的解决方案是指定< code>allocationSize=1:

@SequenceGenerator(name = "generator", sequenceName = "MY_SEQ",
                   allocationSize = 1)

现在,每个插入都会递增Oracle序列。

 类似资料:
  • 我有一个存储库,我正试图用它从序列中获取下一个值。我需要参数化序列名。 存储库查询类似于: @query(value=“select?1.nextval from dual;”,nativeQuery=true)字符串getSeqID(@param(“seqName”)字符串seqName);

  • 问题内容: 错误:已评估但未使用append(sliceA,4) 不知道为什么 切片附加操作未运行… 问题答案: 参考:附加和复制切片 在Go中,参数按值传递。 典型用法是: 您需要写: 输出 : 希望对您有所帮助。

  • 问题内容: 我在Spring上从事API Rest项目。我有一个服务“ CreateMateriel”,它将参数数据JSON作为: Materiel对象的JSON “材料”与“法新社”有多对一的关系。我放置了一个@JsonIdentityInfo标记以使用Agence的Id而不是Agence的Object 但是当我在POST / materiels上发送JSON时,我遇到了以下异常: 经过大量研究

  • 我正在尝试将一个.ear应用程序部署到WildFly10.1Final。ear有2个嵌套的.war文件。war文件中没有“jboss-web.xml”文件。 信息[org.jboss.as.server.deployment.scanner](DeploymentScanner-Threads-1)WFLYDS0004:在部署目录中找到MyApp.ear。要触发部署,请创建一个名为myapp.ea

  • 问题内容: 在Apache Jackson和Jackson一起使用Apache Jersey进行JSON序列化时(在服务器和客户端上),在反序列化通用List时遇到问题。 我正在生成的JSON如下,“数据”中的所有3个类都实现“ CheckStatusDetail”: 产生此JSON的对象如下所示,我在客户端使用相同的类: 自从我将此注释添加到我的CheckStatusDetail接口后,就应用了

  • 问题内容: 我一直在遭受着 hibernate异常 现在社区正在欢呼 说它可以解决问题,但请谨慎使用。 他们谨慎使用意味着什么?此属性实际上是做什么的? 请给我任何见解。提前致谢。 问题答案: 这种方法的问题在于你可以产生N + 1效果。 假设你具有以下实体: 如果你有一个返回1万个人的报告,并且在此报告中执行了代码,那么J将执行10K查询。这是N + 1效果,你将无法控制将要执行的所有查询。 现