猿问

将外键作为模型中的主键

我需要将外键列作为我的休眠应用程序模型中的主键。当我设置@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。正如你所看到的,我有原始类一对一的关系。我需要这种关系是主键


白板的微信
浏览 167回答 2
2回答

噜噜哒

外键允许重复,这使得它们在大多数情况下不适合作为主键。然而,这不是规则。唯一的例外是具有一对一关系的表,其中链接表的外键和主键相同。我遇到了类似的情况并做了这样的事情,@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;    ...}我在这里找到了类似的例子,希望这是你正在寻找的。

慕的地6264312

首先,您不能将关系作为主键。相反,您可以将外键作为主键,当且仅当两个表之间的关系是一对一的。在您的情况下,因为它是一对一的,所以我们很高兴。但不是用@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;    ...}
随时随地看视频慕课网APP

相关分类

Java
我要回答