Oracle before-insert触发器和Hibernate id生成器设置

时间:2012-02-08 08:37:36

标签: oracle hibernate triggers hibernate-mapping id-generation

我有一个持久存储在Oracle架构中的实体。在DB插入时,触发器通过使用DB序列生成实体ID。使用触发器是强制,因为它还会更新ID生成序列(日志表的种类)旁边的另一个表,这对于遗留组件非常重要。

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

在类似的Stackoverflow问题中,我找到了一些不符合我的情况的解决方案:

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

2 个答案:

答案 0 :(得分:0)

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

为什么不能这样做的任何特殊原因?

答案 1 :(得分:0)

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