11

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

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

新元素的创建在第一次运行时可以正常工作。但是,如果我重新启动我的应用程序并取回记录,下次我尝试持久化此实体时,hibernate 会尝试使用未重新启动应用程序时生成的相同 ID。

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

*Hibernate: 插入 org_myEntity (entitiyJID, entityName, 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 数据库

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

4

1 回答 1

16

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

于 2012-07-25T17:04:06.583 回答