小编典典

@GeneratedValue与strategy = GenerationType.AUTO在重新启动后生成重复值

hibernate

我有一个hibernate实体,其ID配置为

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

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

我收到以下错误,并且在使用trace选项运行时,我能够看到ID被重用了

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

顺便说一下,我正在使用hibernate3.3.2.GA,javax.persistance 2.0.0和Derby 10.5.1数据库

有人知道我这一代可能出什么毛病吗,我该如何解决?


阅读 608

收藏
2020-06-20

共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是数据库中序列的名称(您手动创建一个)。

2020-06-20