- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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
。但是随后使用的“生成的标识符”是 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 with Oracle sequence doesn't use it很可能是相关的,但是当我得到的 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
最佳答案
正如我在第 3 次更新中提到的,JPA 预先从序列中“获取 50 个 ID”并在内存中对它们进行计数以提高效率。
此行为由 javax.persistence.SequenceGenerator.allocationSize
指定,默认为 50。
(Optional) The amount to increment by when allocating sequence numbers from the sequence.
这对我来说一点都不直观,or others ,因为我的 Oracle 数据库序列应该定义此行为,而 50 不是那里的标准默认值。
快速而肮脏的解决方案是指定 allocationSize=1
:
@SequenceGenerator(name = "generator", sequenceName = "MY_SEQ",
allocationSize = 1)
现在每次插入时 Oracle 序列都会递增。
关于java - Hibernate 序列 nextVal 已解析但未使用 (Oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38578770/
我有一个这样声明的表列: file_id number(10) generated always as identity primary key, 是否有可能以编程方式获得 currval/nextv
基本上,我需要从一个序列中查询大约一千个 NEXTVAL。我可以循环查询它们,或者我可以通过与一个非常大的表的连接来查询它们。 有没有更简单的方法? 更新。 基本上,我有一个对对象的操作计划。每个对象
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
实际上我们对一些方法使用了 @Transactional(readOnly=true) 但这些方法以某种方式执行 nextVal() 这对其他数据库来说很好但是在 Postgres 9.6.3 上它会
我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT,
我需要增加我的 ID。我必须通过在 oracle 数据库中使用序列来增加。当我使用 INSERT INTO XXX (seq_xxx.nextval, ....) 时出现错误 invalid colu
我想创建一个可以直接复制到 MS Excel 中的模板(通过 SQL)。 总的来说,这很顺利,但是,我遇到了应该存储 Excel 公式的字段的问题。根据用户在 Excel 工作表列之一中的输入,该字段
我的应用程序中有这个 SQL 脚本: select my_seq.nextval from dual connect by level <= 100; 它工作得很好,但是一旦我看到(在日志中)它根本没
我正在使用 spring jdbctemplate 将行插入 mysql 数据库,在批量插入 mysql 数据库时遇到问题。问题是,插入第二行时,我的主键出现重复键冲突。我已将 USER_KEY 放入
我已经寻找并没有找到这个问题的答案: 我使用嵌套选择插入一行,但还需要 uid 序列和日期戳 SQL 插入 insert into countdegreejob (countdegreeid,j
我正在测试 postgresql 序列(使用 http://sqlfiddle.com 和 PostgreSQL 9.3 我目前没有在本地设置 PostgreSQL),但我看到了奇怪的行为。 创建一个
我有一个有维护菜单的应用程序(当然只在极少数情况下使用)。在此菜单中,我还显示了某个序列接下来将生成的下一个数字,并为用户提供了重置序列的选项。 我使用以下查询来显示下一个数字: select cas
我有以下 sql: INSERT INTO in_api_settings ( ENTITY_ID, ACTIVE_START_DATE, ACTIVE_END_DATE) VA
我有一个 PgSQL 9.4.3 服务器设置,之前我只使用公共(public)模式,例如我创建了一个这样的表: CREATE TABLE ma_accessed_by_members_tracking
我在模式中有一个关于 postgresql 9.3 的序列。 我能做到: SELECT last_value, increment_by from foo."SQ_ID";` last_value |
我尝试插入到以sequence .nextval为主键的表中,Java中的sql是 sql = "INSERT INTO USER (USER_PK, ACCOUNTNUMBER,
使用 SQLPlus,我生成了以下序列: CREATE SEQUENCE pubnum_seq START WITH 7 INCREMENT BY 2 MAXVALUE 1000; 我想要做的
如何在一次查询中两次选择相同的序列? 我已经用谷歌搜索了这个,只是无法得到答案。 为了清楚起见,这就是我需要的,例如: select seq.nextval as v1, seq.nextval as
我有以下 3 个表, 数据_Excel 包含姓名、地址、城市和人员来源; 人表 有姓名和身份证; 我需要插入 person_location 地址来源、地址、城市和ID... 我正在使用以下查询: C
我是一名优秀的程序员,十分优秀!