Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用JPA的JavaEE中,如何将几个可能的实体之一与另一个实体关联起来?_Jpa_One To One_Many To One - Fatal编程技术网

在使用JPA的JavaEE中,如何将几个可能的实体之一与另一个实体关联起来?

在使用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 {

我的Java EE应用程序中有以下JPA实体:

  • 公司
  • 资产
每个资产都由一个人或一家公司拥有,因此我的第一个想法是向资产中添加与个人或公司相关的属性,如下所示

@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;
    ...
}
这使我想到以下问题:

  • 什么是成为模特儿的最佳方式
在常规Java中,我将创建一个所有者接口,个人和公司将实现所有者,但我的理解是,这不适用于JPA

如果我创建了以下继承层次结构呢

@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对象。我将继续探索继承技术,看看它是否能把我带到我想去的地方。谢谢你的意见。