我的应用程序需要存储一组"暂存数据"它具有与另一个相同的数据库结构" real"表,但不能写入真实表,直到人检查登台数据的内容。这些不仅仅是对真实表的添加,而是对它的更新(换句话说,在临时表中有与真实表相同的主键的值,因为它们引用相同的实体实例)。
我的方法是让两个JPA @Entity
对象具有相同的结构(即字段,列名等),但存储在不同的表中并完全独立于Spring CrudRepository
透视图(即,在任何时候都不会发生联合查询以跨两个表组合查询结果)。但是,我希望使用继承来使它们可以互换使用,这样我的应用程序就不会真正了解/关心它是否正在处理分段数据的真实情况,所以我不会&#39 ; t必须编写大量的样板getter / setter /转换器代码。
所以,我现在所拥有的基本上是三个类:
BaseEntity
注释的@MappedSuperclass
,并通过@Id
注释Identifier
的{{1}}实体,并为其他一些属性添加其他一些getter / setter并具有BaseEntity
注释@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
但具有不同StagingIdentifier
注释值的Identifier
实体(并且不添加任何其他字段或方法)鉴于某些条件,我希望基本上获取包含@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
个对象 - 这解释了错误。
那么,我试图做的甚至可能吗?
答案 0 :(得分:0)
我最终做的是重构我的课程如下:
BaseEntity
=与我的问题不变AbstractIdentifier
=使用BaseEntity
注释扩展@MappedSuperclass
的新抽象类,Identifier
类的所有属性,getter,setter等都被移入< / LI>
Identifier
和StagingIdentifier
现在几乎是扩展AbstractIdentifier
但具有不同@Table
注释值的存根类以及它们自己的Spring Data存储库然后我在必要时编写了一些方法在Identifier
和StagingIdentifier
之间进行翻译(尽可能多的我不想要)和单元测试以确保这些方法的正确性