我有一个名为
的ID的hibernate实体@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
第一次运行时,新元素的创建工作正常。但是,如果我重新启动我的应用程序并检索回记录,下次当我尝试持久保存此实体时,hibernate会尝试使用在未重新启动应用程序时生成的相同ID。
我收到以下错误,当使用跟踪选项运行时,我能够看到该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数据库
有人知道我这一代可能出现什么问题,我该如何解决?
答案 0 :(得分:13)
如果您使用AUTO,Hibernate将选择一种策略来生成您的ID。来自参考文献:
AUTO - 标识列,序列或表,具体取决于 基础DB。
因此,您必须看到生成的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是数据库中序列的名称(您手动创建一个序列)。