在重新启动后,具有strategy=GenerationType.AUTO的@GeneratedValue生成重复值

11

我有一个使用Hibernate框架的实体,其中一个ID已经被配置为:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
第一次创建新元素时,一切正常。但是如果我重新启动我的应用程序并检索回记录,下一次我尝试持久化此实体时,Hibernate 将尝试使用在应用程序未重新启动时生成的相同 ID。我遇到了下面的错误,并且在使用跟踪选项运行时,我能够看到 ID 被重用:
*Hibernate: insert into org_myEntity (entitiyJID, entitityName, id) values (?, ?, ?) org.hibernate.util.JDBCExceptionReporter SQL Error: 20000, SQLState: 23505 org.hibernate.util.JDBCExceptionReporter The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL120725164357680' defined on 'TABLE_NAME'. org.hibernate.event.def.AbstractFlushingEventListener Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not
顺便说一句,我正在使用 Hibernate 3.3.2.GA、javax.persistence 2.0.0 和 Derby 10.5.1 数据库。有人知道我的生成有什么问题以及我该如何解决吗?
1个回答

16
如果您使用AUTO选项,Hibernate将选择一种策略来生成您的ID。引用如下:
"AUTO" - 根据底层数据库,可以是identity列、序列或表。
因此,您必须查看生成的id以确定Derby正在使用哪种策略。尽管它看起来像是每次重新启动应用程序时都会重置生成器。尝试设置。
<prop key="hibernate.hbm2ddl.auto">update</prop>

但是您可以使用序列生成器快速修复它。像这样:

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="ENTITY_SEQ")
private Long id;

其中ENTITY_SEQ是您数据库中序列的名称(需要手动创建)。


2
这有点棘手,但是你对“hibernate.hbm2ddl.auto”的备注让我恍然大悟。最终,我有一个项目属性文件,其中hibernate.hbm2ddl.auto设置为create-drop,而其中一个bundle的SessionFactory则将hibernate.hbm2ddl.auto设置为update。因此,这导致该bundle的数据保留在数据库中,但迭代器被重新启动。Obrigado pela dica =D - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接