这个问题在这里被问到并得到了回答:
How to create a composition primary key which contains a @ManyToOne attribute as an @EmbeddedId in JPA?
你需要四个类:
- 人.java
- 主页.java
- 个人主页.java
- PersonHomePk.java
您创建的 Person.java 和 Home.java 文件与 PersonHome.java 具有一对多的关系。他们将有 @Id 字段来识别主键。每个都将定义一个 @OneToMany 关系,其中至少有一个 mappedBy 属性映射到 PersonHome 实体中它们各自的字段。即在 Person.java 你可以有类似的东西
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Person")
private Collection<PersonHome> personHome;
PersonHome.java 将有一个 @EmbeddedId 字段来标识作为其主键的 PersonHomePk 实例声明(也就是说,而不是 @Id 列,您将有一个 @EmbeddedId 注释表示连接主键的类的声明表 PersonHome)。任何其他字段都被声明为普通列。PersonHome.java 还将声明两个 ManyToOne 关系,每个关系与人和家庭有关。这些将使用@JoinColumn 注释(确保它们具有属性 insertable=false 和 updatable=false)。数据类型将是 Person 和 Home 类。IE
@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,这样当你不在时维护它的人会更好地理解代码和数据库。“分离”更容易理解“d”。