JPA:如何自动生成影子表(历史记录)
我正在使用EclipseLink的历史记录function 。
据我所知,目前还没有实际创建影子表的支持 。 我正在为所有基表使用JPA 2.1自动化模式生成。 工作良好。
现在我正在寻找一种自动化创建影子表的方法。 对于每个基表,应该有一个带有一些额外列的影子表。 否则,影子表具有正在遮蔽的表的确切结构。
我在模型中有超过50个实体,并且在其中抛出了一些多对多关系,所有映射到大约55个物理表。 我不想为所有影子表维护DDL创建脚本。
现在该项目与数据库无关(至少对于通常的嫌疑人而言),我想保持这种方式。 绑定到EclipseLink不是问题所以EclipseLink特定的解决方案是可以的。
那么,如何创建影子表呢?
可以使用子类来表示每个历史表。 假设基类是Car
,那么:
@Entity @Table(name="CAR_HIST") public class ClassHist extends Car { ... // some extra audit fields here }
并且在Car
上使用@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
注释它实际上将使用JPA模式生成来完成工作。 所以,几乎就是这样。 除了没有实体的多对多关系表,我可以得到实际操作,因此无法获得为关系表生成的影子表。
UPDATE
原来使用inheritance来创建影子表并不是一个好主意。 原因是JPA JPQL查询是多态的 。 这意味着像SELECT a FROM Car
这样的查询实际上也会进入CAR_HIST
表,因为CarHist
只是Car
一个子类。 从这些表中获取SELECT的UNION。 显然不想要我想要。 它不是一个好主意的另一个原因是用于历史的子类将inheritance其父级的主键。 这也是完全错误的。
更新2
我发现EclipseLink中有这个function的RFE 。