2012-04-25 63 views
2

这是我第二篇关于hibernate的文章。自从我开始使用hibernate以来,它已经给出了比它解决的问题更多的问题。这几乎让我觉得我应该坚持原始的JDBC。无论如何,Hibernate SequenceGenerator返回不正确的nextval

这是我试图战斗的问题之一。

.hbm文件中的我的序列生成器如下所示。

<id name="id" type="long" column="ID"> 
    <generator class="sequence"> 
     <param name="sequence">ADVENTURES_ID_SEQ</param> 
     <param name="allocationSize">1</param> 
     <param name="initialValue">17599</param> 
    </generator> 
</id> 

请注意:初始值是17599.这是因为LAST_NUMBER在oracle序列为:17599

CREATED   25-APR-12 
LAST_DDL_TIME 25-APR-12 
SEQUENCE_OWNER ADVENTURE_ADMIN 
SEQUENCE_NAME ADVENTURES_ID_SEQ 
MIN_VALUE  1 
MAX_VALUE  9999999999999999999999999999 
INCREMENT_BY 1 
CYCLE_FLAG  N 
ORDER_FLAG  N 
CACHE_SIZE  20 
LAST_NUMBER  17599 

当我运行我看到在201至200产生的下一个序列,该代码Hibernate调试语句。

DEBUG SQL - select ADVENTURES_ID_SEQ.nextval from dual 
DEBUG SequenceGenerator - Sequence identifier generated: 201 

我预计nextval应该是17600.看起来像oracle序列根本没有被使用。

我的配置有什么问题,以及如何解决这个问题。任何帮助是极大的赞赏。

感谢

+0

如果您在同一数据库上运行'从双选'选择ADVENTURES_ID_SEQ.nextval,它会产生什么? – Firo 2012-04-26 09:53:55

+0

它给出了正确的值17584,17585,17586等。我们的DBA告诉我们信息表有时可以显示不正确的值,在这种情况下是17599。这个不正确的值是因为他们(Oracle)做了一些快捷方式来计算信息,它只能用作指导。 – n00bc0der 2012-04-26 13:46:58

回答

2

自答(解决方法):我仍然看到这个问题,但现在我有一个解决办法。由于它对我有用,所以我选择了完整的问题。

我让甲骨文生成nextId使用触发:

create or replace 
TRIGGER ADVENTURE_ADMIN.ADVENTURES_ID_TRIG 
BEFORE INSERT ON ADVENTURE_ADMIN.ADVENTURES FOR EACH ROW 
WHEN (new.ID IS NULL) 
BEGIN 
    SELECT ADVENTURES_ID_SEQ.NEXTVAL INTO :new.ID FROM DUAL; 
END; 

然后我让休眠使用Oracle触发器生成的ID。有两种方法可以做到这一点。

第一个是通过使用休眠select。这种方法的缺点是你需要在表中有另一个列,并且有唯一的约束,这个约束被hibernate用作获取行的键。它并不适合我,因为我拥有主键作为唯一唯一键的表。

第二个是使用由Jean-Pol Landrain,Martin Zeltner创建的TriggerAssignedIdentityGenerator。来源可以发现here。这使我能够解决为表格找到另一个唯一键的问题。

以下是我如何使用它:

<id name="id" type="long" column="ID"> 
    <generator class="org.hibernate.id.TriggerAssignedIdentityGenerator" /> 
</id> 

请注意:您正在使用Hibernate的事务版本。我正在使用3.5.4。休眠3.6不适合我。 JDBC和Oracle驱动程序版本也很重要。您可以参考源文件中的相同文档。

+1

很高兴我的ID发电机帮助你! 您可以在Hibernate论坛上找到与此生成器相关的原始帖子。现在它已经很老了,但许多人的贡献使它保持活着,即使使用Hibernate 4. https://forum.hibernate.org/viewtopic.php?t=973262 – jplandrain 2013-11-20 10:20:19

+0

@ n00bc0der你找到了你的问题的原因? – 2017-10-25 20:57:25