将外键作为模型中的主键

时间:2018-10-15 05:08:57

标签: java hibernate model primary-key

我需要在休眠应用程序模型中将外键列作为主键。当我设置@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。如您所见,我具有起源类一对一的关系。我需要这种关系成为主键

2 个答案:

答案 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;

    ...
}