有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何建模多个关系

如何使用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_home拆分为person_primary_home和person_secondary_home,但是如果可能的话,我更愿意保留模式


共 (2) 个答案

  1. # 1 楼答案

    我相信,除了person_home表上的关系之外,如果还需要元数据,那么需要使用三个具有两个一对多关系的对象,以便能够访问所有数据

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

  2. # 2 楼答案

    这个问题在这里被问到和回答:
    How to create a composite primary key which contains a @ManyToOne attribute as an @EmbeddedId in JPA?

    你需要四门课:

    1. 人。爪哇
    2. 回家。爪哇
    3. 私人住宅。爪哇
    4. PersonHomePk。爪哇

    那个人。爪哇和家。创建的java文件与PersonHome具有一对多关系。JAVA它们将有@Id字段来标识主键。每个人都有一个@OneToMany关系,该关系至少由映射到PersonHome实体中各自字段的mappedBy属性定义。i、 e.面对面。java你可以有

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

    这个人回家了。java将有一个@EmbeddedId字段来标识PersonHomePk实例声明,它是java的主键(也就是说,您将有一个@EmbeddedId来注释表示联接表PersonHome主键的类的声明,而不是@Id列)。任何其他字段都声明为普通列。这个人回家了。java还将声明两种多人关系,一种是个人关系,另一种是家庭关系。它们将使用@JoinColumn注释(确保它们具有insertable=false和updateable=false属性)。数据类型将是Person和Home类。i、 e

    @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;
    

    你也需要同样的“家”声明

    为什么只使用字符来表示“类型”。我推荐使用varchar,这样在你不在的时候,那些在你离开后维护它的人会更好地理解代码和数据库“分离”更容易理解“d”