@GenerateValue with Strategy=GenerationType.AUTO 重启后生成重复值

2024-04-21

我有一个 ID 配置为的休眠实体

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

新元素的创建在第一次运行时工作正常。但是,如果我重新启动应用程序并检索记录,下次我尝试保留该实体时,hibernate 会尝试使用应用程序未重新启动时生成的相同 ID。

我收到以下错误,当使用跟踪选项运行时,我能够看到 ID 被重用

*Hibernate:插入到org_myEntity(entitiyJID,entityName,id)值(?,?,?)org.hibernate.util.JDBCExceptionReporter
SQL 错误:20000,SQL 状态:23505 org.hibernate.util.JDBCExceptionReporter 的 语句被中止,因为它会导致重复的键 唯一或主键约束或唯一索引中标识的值 通过在“TABLE_NAME”上定义的“SQL120725164357680”。 org.hibernate.event.def.AbstractFlushingEventListener
无法将数据库状态与会话同步 org.hibernate.exception.ConstraintViolationException:不能*

顺便说一下,我使用的是 hibernate 3.3.2.GA、javax.persistance 2.0.0 和 Derby 10.5.1 数据库

有人知道我们这一代人可能出了什么问题吗?我该如何解决它?


如果您使用 AUTO,Hibernate 将选择其中一种策略来生成您的 id。来自参考文献:

AUTO - 标识列、序列或表,具体取决于 底层数据库。

因此,您必须查看生成的 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 是数据库中序列的名称(您手动创建一个)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@GenerateValue with Strategy=GenerationType.AUTO 重启后生成重复值 的相关文章

随机推荐