2

我有一个保存在 Oracle 模式中的实体。在 DB 插入时,触发器使用 DB 序列生成实体 ID。使用触发器是强制性的,因为它还会更新 ID 生成序列(一种日志表)旁边的另一个表,这对于遗留组件很重要。

如何在我的实体映射中配置 Hibernate id 生成器?

环顾类似的 Stackoverflow 问题,我发现了一些不适合我的解决方案:

  1. 直接使用序列:<generator class="sequence">...</generator>. 这是不可能的,因为其余的触发代码不会被执行
  2. 使用<generator class="select">...</generator>which 表示插入后,Hibernate 使用另一个唯一属性选择实体(根据 Hibernate-3.3 手册 5.1.4.6. )。这在此处也是不可能的,因为没有其他唯一列并且不支持使用一组属性。
  3. 打电话前使用<generator class="assigned">...</generator>和设置假身份证save()。DB 触发器将忽略此 ID,并且生成的 DB 行将具有正确的 ID。但是,我的 Java 实例没有,而且这个解决方案很难看,因为它对触发器的实现做出了假设。

这个问题有好的解决方案吗?

4

2 回答 2

0

<generator class="select">是更正确的解决方案。您无法选择自动生成的值这一事实仅表明 ypu 模型和生成器恕我直言的选择存在问题。您可以尝试使用<generator class="sequence-identity">,但正如我在 javadocs (org.hibernate.id.SequenceIdentityGenerator() 中提到的那样,根据我的经验,在 Oracle 驱动程序中对 getGeneratedKeys 的支持相当参差不齐,或者至少在几年前我第一次开发和测试了那个发电机。

于 2012-07-09T14:39:32.840 回答
0

生成 ID 和更新其他表应该是单独的任务。您可以直接使用序列,并且只在触发器中保留“更新其他表”代码。

有什么特殊原因不能做到这一点吗?

于 2012-07-09T12:56:07.387 回答