gpt4 book ai didi

java - 如何建模多对多关系

转载 作者:行者123 更新时间:2023-11-30 11:43:53 24 4
gpt4 key购买 nike

如何使用 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,但如果可能,我更愿意保留架构。

最佳答案

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

你需要四个类:

  1. Person.java
  2. 首页.java
  3. PersonH​​ome.java
  4. PersonH​​omePk.java

您创建的 Person.java 和 Home.java 文件与 PersonH​​ome.java 具有一对多关系。他们将有 @Id 字段来标识主键。每个人都将有一个 @OneToMany 关系,其中至少有一个映射到 PersonH​​ome 实体中各自字段的 mappedBy 属性。即在 Person.java 中你可以有类似

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

PersonH​​ome.java 将有一个 @EmbeddedId 字段来标识作为其主键的 PersonH​​omePk 实例声明(也就是说,您将有一个 @EmbeddedId 注释表示主键的类的声明,而不是 @Id 列连接表 PersonH​​ome)。任何其他字段都声明为普通列。 PersonH​​ome.java 还将声明两个 ManyToOne 关系,每个关系一个到个人和一个家庭。这些将使用@JoinColumn 注释(确保它们具有属性 insertable=false 和 updatable=false)。数据类型将是 Person 和 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;

对于“Home”声明,您也需要相同的声明。

为什么您只使用一个字符作为“类型”。我建议使用 varchar,这样在您离开后维护它的人将在您不在时更好地理解代码和数据库。 'detached' 更容易理解 'd'。

关于java - 如何建模多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11056996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com