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