2 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
外鍵允許重復(fù),這使得它們在大多數(shù)情況下不適合作為主鍵。然而,這不是規(guī)則。
唯一的例外是具有一對一關(guān)系的表,其中鏈接表的外鍵和主鍵相同。
我遇到了類似的情況并做了這樣的事情,
@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貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,您不能將關(guān)系作為主鍵。相反,您可以將外鍵作為主鍵,當(dāng)且僅當(dāng)兩個(gè)表之間的關(guān)系是一對一的。
在您的情況下,因?yàn)樗且粚σ坏?,所以我們很高興。
但不是用@Id 注釋Origin。使用@Id 注釋外鍵并在定義關(guān)系時(shí)使用@MapsId。
請參閱下面的示例代碼,其中人員和人員詳細(xì)信息具有一對一的關(guān)系。
人員詳細(xì)信息實(shí)體如下所示:
@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;
...
}
人實(shí)體看起來像:
@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;
...
}
添加回答
舉報(bào)