我有一个持久存储在Oracle架构中的实体。在DB插入时,触发器通过使用DB序列生成实体ID。使用触发器是强制,因为它还会更新ID生成序列(日志表的种类)旁边的另一个表,这对于遗留组件非常重要。
如何在实体映射中配置Hibernate id生成器?
在类似的Stackoverflow问题中,我找到了一些不符合我的情况的解决方案:
<generator class="sequence">...</generator>
。这是不可能的,因为其余的触发器代码不会被执行<generator class="select">...</generator>
表示插入后,Hibernate使用另一个唯一属性选择实体(根据Hibernate-3.3手册5.1.4.6。)。这也是不可能的,因为没有其他唯一列,并且不支持使用一组属性。<generator class="assigned">...</generator>
之前使用save()
并设置假身份证。 DB触发器将忽略此ID,并且生成的DB行将具有正确的ID。但是,我的Java实例不会有这个解决方案,因为它会对触发器的实现做出假设,因此这个解决方案很难实现。这个问题有一个很好的解决方案吗?
答案 0 :(得分:0)
生成ID并更新其他表应该是单独的任务。 您可以直接使用序列,只在触发器中保留“更新其他表”代码。
为什么不能这样做的任何特殊原因?
答案 1 :(得分:0)
<generator class="select">
是更正确的解决方案。您无法选择返回自动生成的值这一事实只显示ypu模型和生成器恕我直言的选择问题。您可以尝试使用<generator class="sequence-identity">
,但正如我在javadocs中提到的那样(org.hibernate.id.SequenceIdentityGenerator(),根据我的经验,对Oracle驱动程序中的getGeneratedKeys的支持是相当不稳定的,或者至少在几年前回来了当我第一次开发并测试那台发电机时。