Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
Java 如何建立多对多关系模型_Java_Hibernate_Jpa - Fatal编程技术网

Java 如何建立多对多关系模型

Java 如何建立多对多关系模型,java,hibernate,jpa,Java,Hibernate,Jpa,如何使用JPA实现以下关系 table person ( id int, name text ) table person_home ( person_id int, home_id int, type char(1) -- 'p' = primary, 's' = secondary ) table home ( id int, address text ) 一个人可以有许多家,一个家可以有许多人居住在其中(即许多人的关系)。

如何使用JPA实现以下关系

table person (
  id int,
  name text
)

table person_home (
    person_id int,
    home_id int,
    type char(1)       -- 'p' = primary, 's' = secondary
)

table home (
    id int,
    address text
)
一个人可以有许多家,一个家可以有许多人居住在其中(即许多人的关系)。 此外,家庭可以是一个人的主要住所,但同时也是另一个人的次要住所

我不确定如何对这种关系建模,即使数据库模式很清楚


我曾想过将映射表person\u home拆分为person\u primary\u home和person\u secondary\u home,但是如果可能的话,我更愿意保留模式。

我相信如果您在person\u home表上除了关系之外还有元数据,为了能够访问所有数据,您需要使用三个具有两个一对多关系的对象


您可以通过从person表到home表建立两个多对一关系,通过拥有primary\u home\u id和secondary\u home\u id来消除这种需要——除非我在这里遗漏了一个要求,一个人可以拥有多个primary或secondary home。

这个问题在这里得到了大量的询问和回答:

你需要四门课:

  • Person.java
  • Home.java
  • PersonHome.java
  • PersonHomePk.java
  • 创建的Person.java和Home.java文件与PersonHome.java有一对多的关系。它们将有@Id字段来标识主键。每个人都有一个@OneToMany关系,该关系至少由映射到PersonHome实体中各自字段的mappedBy属性定义。i、 e.在Person.java中,您可以有如下内容

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "Person")
    private Collection<PersonHome> personHome;
    

    “Home”声明也需要相同的字符。

    为什么只对“type”使用字符。我建议使用varchar,这样在你不在的时候,那些在你离开后维护它的人会更好地理解代码和数据库“d”更容易理解

    是的,一个人可以拥有每种类型的多个家。所以答案是,我也需要将映射表建模为一个类?如果您想以某种方式获得
    type
    列,那么我相信是的。我经常谈到这一点,因为在关系上有元数据非常有用。我相信我找到了一种方法,可以将其称为多对多,但无论如何,我必须用对象来表示关系。更容易理解为两个
    一对多
    关系。我相信对于
    多对多
    ,您会使用注释
    @ManyToMany(mappedBy=“person\u home”)
    ,但正如您所见,它会忽略您的元数据
    @EmbeddedId
    protected PersonHomePk personHomePk;
    @Column (name = "type")
    private String type; 
    @JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Person person;