@GeneratedValue with strategy = GenerationType.AUTO在重启后生成重复值

Tho*_*mas 10 annotations hibernate id-generation

我有一个配置为ID的hibernate实体

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
Run Code Online (Sandbox Code Playgroud)

第一次运行时,新元素的创建工作正常.但是,如果我重新启动我的应用程序并检索回记录,下次当我尝试持久保存此实体时,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:无法*

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

有人知道我这一代可能出现什么问题,我该如何解决?

Tia*_*ias 14

如果您使用AUTO,Hibernate将选择一种策略来生成您的ID.来自参考:

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

因此,您必须查看生成的ID以查看Derby使用的策略.虽然它看起来像,但每次重新启动应用程序时它都会重置生成器.尝试设置

<prop key="hibernate.hbm2ddl.auto">update</prop>
Run Code Online (Sandbox Code Playgroud)

您可以使用序列生成器快速修复它.喜欢:

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

其中ENTITY_SEQ是数据库中序列的名称(您手动创建一个序列).

  • 这有点棘手,但你对"hibernate.hbm2ddl.auto"的评论仍然响起.我终于有一个项目属性文件,其中hibernate.hbm2ddl.auto设置为create-drop,其中一个bundle的SessionFactory设置为更新hibernate.hbm2ddl.auto.因此,导致我的数据包保存在数据库中,但重新启动迭代器.Obrigado pela dica = D. (2认同)