Java 如何建立多对多关系模型
如何使用JPA实现以下关系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 ) 一个人可以有许多家,一个家可以有许多人居住在其中(即许多人的关系)。
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。这个问题在这里得到了大量的询问和回答:
你需要四门课:
@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;