两个结构相同但表格不同的JPA / Spring Data实体

时间:2017-03-15 01:57:04

标签: java hibernate jpa inheritance spring-data-jpa

我的应用程序需要存储一组"暂存数据"它具有与另一个相同的数据库结构" real"表,但不能写入真实表,直到人检查登台数据的内容。这些不仅仅是对真实表的添加,而是对它的更新(换句话说,在临时表中有与真实表相同的主键的值,因为它们引用相同的实体实例)。

我的方法是让两个JPA @Entity对象具有相同的结构(即字段,列名等),但存储在不同的表中并完全独立于Spring CrudRepository透视图(即,在任何时候都不会发生联合查询以跨两个表组合查询结果)。但是,我希望使用继承来使它们可以互换使用,这样我的应用程序就不会真正了解/关心它是否正在处理分段数据的真实情况,所以我不会&#39 ; t必须编写大量的样板getter / setter /转换器代码。

所以,我现在所拥有的基本上是三个类:

    使用BaseEntity注释的
  1. @MappedSuperclass,并通过@Id注释
  2. 标识公共ID属性
  3. 扩展Identifier的{​​{1}}实体,并为其他一些属性添加其他一些getter / setter并具有BaseEntity注释
  4. 扩展@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)但具有不同StagingIdentifier注释值的Identifier实体(并且不添加任何其他字段或方法)
  5. 鉴于某些条件,我希望基本上获取包含@Table个对象的表的内容,并将其合并(即更新现有条目,添加新条目等)到包含Identifier对象的表中。我使用Envers进行数据库审计,所以不要做任何低级别的数据库工作,这意味着我将失去任何可审计性。

    当我还使用StagingIdentifier尝试保存标识符对象列表时,还有保存到数据库的StagingIdentifier对象(具有相同的ID值),当Hibernate尝试执行时,我得到以下异常合并:

      

    org.springframework.orm.ObjectRetrievalFailureException:Object   [id = null]不是指定的子类[com.domain.Identifier]:   给定对象的类与持久副本的类不匹配;

         

    嵌套异常是org.hibernate.WrongClassException:Object   [id = null]不是指定的子类[com.domain.Identifier]:   给定对象的类与持久副本的类不匹配

    当我查看Hibernate生成的SQL时,我看到:

      

    DEBUG org.hibernate.SQL - 选择identifier0_.id为id1_10_0_,   identifier0_.level为level2_10_0_,identifier0_.name为name3_10_0_,   identifier0_.parent_id为parent_i4_10_0_,identifier0_.clazz_ as   clazz_0_ from(选择id,level,name,parent_id,0为clazz_ from   标识符联合所有选择id,level,name,parent_id,1 as clazz_   来自staging_identifiers)identifier0_ where identifier0_.id =?

    ...因此上述查询同时提取了CrudRepository<Identifier, Integer>Identifier个对象 - 这解释了错误。

    那么,我试图做的甚至可能吗?

1 个答案:

答案 0 :(得分:0)

我最终做的是重构我的课程如下:

  1. BaseEntity =与我的问题不变
  2. AbstractIdentifier =使用BaseEntity注释扩展@MappedSuperclass的新抽象类,Identifier类的所有属性,getter,setter等都被移入< / LI>
  3. IdentifierStagingIdentifier现在几乎是扩展AbstractIdentifier但具有不同@Table注释值的存根类以及它们自己的Spring Data存储库
  4. 然后我在必要时编写了一些方法在IdentifierStagingIdentifier之间进行翻译(尽可能多的我不想要)和单元测试以确保这些方法的正确性