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,但是如果可能的话,我更愿意保留模式
# 1 楼答案
我相信,除了person_home表上的关系之外,如果还需要元数据,那么需要使用三个具有两个一对多关系的对象,以便能够访问所有数据
您可以通过从person表到home表建立两个多对一关系,通过拥有primary_home_id和secondary_home_id来消除这种需求,除非我在这里遗漏了一个要求,并且一个人可以拥有多个primary或secondary home
# 2 楼答案
这个问题在这里被问到和回答:
How to create a composite primary key which contains a @ManyToOne attribute as an @EmbeddedId in JPA?
你需要四门课:
那个人。爪哇和家。创建的java文件与PersonHome具有一对多关系。JAVA它们将有@Id字段来标识主键。每个人都有一个@OneToMany关系,该关系至少由映射到PersonHome实体中各自字段的mappedBy属性定义。i、 e.面对面。java你可以有
这个人回家了。java将有一个@EmbeddedId字段来标识PersonHomePk实例声明,它是java的主键(也就是说,您将有一个@EmbeddedId来注释表示联接表PersonHome主键的类的声明,而不是@Id列)。任何其他字段都声明为普通列。这个人回家了。java还将声明两种多人关系,一种是个人关系,另一种是家庭关系。它们将使用@JoinColumn注释(确保它们具有insertable=false和updateable=false属性)。数据类型将是Person和Home类。i、 e
你也需要同样的“家”声明
为什么只使用字符来表示“类型”。我推荐使用varchar,这样在你不在的时候,那些在你离开后维护它的人会更好地理解代码和数据库“分离”更容易理解“d”