我需要在休眠应用程序模型中将外键列作为主键。当我设置@Id时出现错误。 这是我的模特
@Entity
@Table(name = "otp")
public class OTP {
@Id
private Origin origin;
private int code;
@Column(name = "created_at", nullable = true)
private Date created_at=new Date();
}
以上实体模型无法添加ID。那么如何为外键列添加ID。如您所见,我具有起源类一对一的关系。我需要这种关系成为主键
答案 0 :(得分:1)
外键允许重复,这使它们在大多数情况下不适合用作主键。但这不是规则。
唯一的例外是具有一对一关系的表,其中链接表的外键和主键相同。
我遇到了类似的情况,做了类似的事情,
@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;
...
}
我找到了类似的示例here,希望这就是您想要的。
答案 1 :(得分:1)
首先,您不能将关系作为主键。相反,当且仅当两个表之间的关系是一对一的关系时,才可以将外键作为主键。
在您的情况下,因为这是一对一的关系,所以我们很乐意去。
但是不要用@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;
...
}