在使用JPA的JavaEE中,如何将几个可能的实体之一与另一个实体关联起来?
我的Java EE应用程序中有以下JPA实体:在使用JPA的JavaEE中,如何将几个可能的实体之一与另一个实体关联起来?,jpa,one-to-one,many-to-one,Jpa,One To One,Many To One,我的Java EE应用程序中有以下JPA实体: 人 公司 资产 每个资产都由一个人或一家公司拥有,因此我的第一个想法是向资产中添加与个人或公司相关的属性,如下所示 @Entity public class Asset { ... @ManyToOne private Person ownerP; @ManyToOne private Company ownerC; ... } @Entity public class Asset {
- 人
- 公司
- 资产
@Entity
public class Asset {
...
@ManyToOne
private Person ownerP;
@ManyToOne
private Company ownerC;
...
}
@Entity
public class Asset {
...
@ManyToOne
private Owner owner;
...
}
我只想要一个所有者,所以我的第二个想法是可以使用继承将两个属性合并为一个,如下所示
@Entity
public class Asset {
...
@ManyToOne
private Person ownerP;
@ManyToOne
private Company ownerC;
...
}
@Entity
public class Asset {
...
@ManyToOne
private Owner owner;
...
}
这使我想到以下问题:
- 什么是成为模特儿的最佳方式
@Entity
public abstract class Owner {
...
}
@Entity
public class OwnerPerson extends Owner {
...
@OneToOne
private Person person;
...
}
@Entity
public class OwnerCompany extends Owner {
...
@OneToOne
private Company company;
...
}
我认为这是可行的,但需要我在每次创建个人或公司实体时创建一个所有者实体
有更好的方法吗?我不太确定它是否正确。您应该认为JPA真的试图描述与数据库相同的关系,所以从数据库的角度考虑,您认为存在从另一个表继承的表吗?你会如何表达?
依我看,你已经开始用屋顶而不是地下室来建造房子了。首先,在数据库中对其建模,然后使用JPA转换其关系。我没有遵循您的逻辑。请提供一个示例,说明您将如何对所描述的关系进行建模,以使个人或公司成为资产的所有者。正如我所说,您必须首先在数据库中对其进行建模,然后用java编写代码。我相信,若个人和公司是具有不同属性的不同表,那个么它们看起来就像是一个表,所以资产必须与个人和公司有关系。这意味着资产必须包含一个表示“人”的属性和另一个表示“公司”的属性,而不是一个关系模棱两可的混合属性(JPA关系必须公平明确,资产和可能是人或不可能是人的东西之间的关系)一旦解释了它,如果bot公司和人共享属性,您可以创建一个超类,它们都将从中继承这些字段进行扩展。超级类不会有“实体”注释,因为它不是实体,只是java类。子类将添加自己的显式字段,这些类将有自己的注释来定义自己的和继承的字段的含义。我认为超级类将需要一个JPA实体,以便JSF数据表(实际上是PrimeFaces数据表)将能够显示完整的所有者列表,其中包括OwnerPerson和OwnerCompany对象。我将继续探索继承技术,看看它是否能把我带到我想去的地方。谢谢你的意见。