JPA序列生成器持续存在不正确的值

时间:2014-04-15 17:35:39

标签: java oracle jpa

我有一个Oracle DB序列,由以下JPA调用。问题是返回的序列与数据库实际使用的序列号不同。 JPA组件通常比插入表中的记录的实际ID小1。例如,当调试JPA时,对象的Id将是3689711但是在记录持久化之后,表中的实际记录是3689712,但它并不总是如此可识别。创建记录后,我需要获取正确的ID,以便将其传递给另一个进程,但如果没有正确的数字,则下一个进程将失败。

@Id
@SequenceGenerator(name="S_DRLEARNINGACTIVITYTRANSCRIPT", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="S_DRLEARNINGACTIVITYTRANSCRIPT")
@Basic(optional = false)
@NotNull
@Column(name = "ID")
private Long id;

#1 ** 我的Oracle序列有以下DDL:

CREATE SEQUENCE  "S_DRLEARNINGACTIVITYTRANSCRIPT"  
MINVALUE 1 MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 START WITH 3690531 CACHE 20 NOORDER  NOCYCLE ;

我知道我可以解决这个问题,并为另一个字段添加一个临时值,然后查看一个临时值,以便在记录持久化后获得PK的实际值,但这看起来好像很多DB要求这个基本的东西。任何帮助将不胜感激。

#2 ** JPA似乎只是从序列中查询nextVal,但在实际提交之前无法将其锁定到DB中。因为它执行序列以确定强制序列自动生成新nextVal的下一个值。我不确定这是否重要,但我的序列在记录插入表格之前被触发。因此,当JPA最终提交记录时,底层数据库触发器/序列实际上生成一个新的序列值,这意味着JPA声称具有的原始序列号在它再次调用序列时实际上被底层数据库覆盖。因此,唯一有意义的解决方案是修改底层数据库触发器,以便在列已经有值时不生成序列,但这似乎有风险。如果你需要利用其他过程的序列号,JPA中的序列生成最好是有缺陷的。

0 个答案:

没有答案