0

我不确定这是否可能,但只知道 JPA 的基础知识,我想问一下是否可能。基本上我有一个实体(我们称之为MyEntity),上面有一堆字段。我们现在想要一个第二个实体,它具有所有相同的字段MyEntity以及一些它自己的字段。用例是归档这些实体。我们希望将所有归档实体存储在单独的表中,MyEntity这样我们就不必使用archived=false. JPA 注释MyEntity看起来像这样:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public abstract class MyEntity
{
    ....

有多个类扩展了这个抽象类,每个类都有@DiscriminatorValue注释

对于我的存档实体 ( MyArchivedEntity),我想要一些类似的东西:

@Entity
public class MyArchivedEntity
{
    private MyEntity entity;
    private String archiveSpecificField;
    ....

当然,这个问题是它想要加入MyEntity表并获得一个特定的MyEntity记录来填充该entity字段。是否有某种注释或我可以做些什么来将该实体()中的相同字段/列获取MyEntity到该实体(MyArchivedEntity)中?

就像我在开始时所说的那样,我不确定这是否可能,但我希望我已经充分解释了我想要实现的最终目标,以便有一些方法可以实现它。如果有什么不同,我将 PostgreSQL 与 EclipseLink 一起使用。

4

2 回答 2

1

您可以做的是@MappedSuperclass在 AbstractParentEntity 上使用成为 和 的超MyEntityMyArchiveEntity。因此,您将拥有以下内容:

@MappedSuperclass
public abstract class AbstractParentEntity {
    public String someField;
    ...
}

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public abstract class MyEntity extends AbstractParentEntity 
{
   //here you don't have any field (they all move to  AbstractParentEntity
   // (or, at least all the fields that need to be archivied are now declared in parent class)
   ....
}

@Entity
public class MyArchivedEntity extends AbstractParentEntity  
{
    private String archiveSpecificField;
    ....

更多关于 MappedSuperclass的信息

映射超类继承允许在对象模型中使用继承,当它在数据模型中不存在时。它类似于按类继承的表,但不允许查询、持久化或与超类建立关系。它的主要目的是允许映射信息被它的子类继承。子类负责定义表、id 和其他信息,并且可以修改任何继承的映射。映射超类的一个常见用法是为您的应用程序定义一个公共 PersistentObject 来定义公共行为和映射,例如 id 和版本。映射的超类通常应该是抽象类。映射的超类不是实体,而是通过 @MappedSuperclass 注释或<mapped-superclass>元素定义的。

于 2013-02-27T13:59:48.040 回答
0

您可能希望查看 EclipseLink 的历史支持。它可以自动维护一个历史存档表。

见, http://wiki.eclipse.org/EclipseLink/Examples/JPA/History

另一种选择是使用 orm.xml 将另一个持久性单元中的相同类映射到存档表。

于 2013-02-27T15:17:39.730 回答