2 回答
TA贡献1784条经验 获得超7个赞
外键允许重复,这使得它们在大多数情况下不适合作为主键。然而,这不是规则。
唯一的例外是具有一对一关系的表,其中链接表的外键和主键相同。
我遇到了类似的情况并做了这样的事情,
@Entity
@Table(name = "PERSON_DETAILS")
public class PersonDetails {
@Id
private Long personId;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_PERSON", nullable = false)
@MapsId
private Person person;
....
}
@Entity
@Table(name = "PERSON")
@SequenceGenerator(name = "SQ_PRSN_ID", sequenceName = "SQ_PRSN_ID")
public class Person{
@Id
@GeneratedValue(generator = "SQ_PRSN_ID", strategy = GenerationType.SEQUENCE)
@Column(name = "ID_PERSON", nullable = false)
private Long personId;
...
}
我在这里找到了类似的例子,希望这是你正在寻找的。
TA贡献1817条经验 获得超6个赞
首先,您不能将关系作为主键。相反,您可以将外键作为主键,当且仅当两个表之间的关系是一对一的。
在您的情况下,因为它是一对一的,所以我们很高兴。
但不是用@Id 注释Origin。使用@Id 注释外键并在定义关系时使用@MapsId。
请参阅下面的示例代码,其中人员和人员详细信息具有一对一的关系。
人员详细信息实体如下所示:
@Entity
@Table(name = "person_details")
public class PersonDetails {
@Id
@Column(name = "person_details_Id")
private Long personId;
@Column(name = "person_name")
private String personName;
@OneToOne
@JoinColumn(name = "person_Id")
@MapsId
private Person person;
...
}
人实体看起来像:
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "person_seq")
@Column(name = "person_id")
private Long personId;
@Column(name = "person_profsn")
private String personProfession;
@OneToOne(mappedBy = "person")
private PersonDetails personDetails;
...
}
添加回答
举报