有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将外键作为模型中的主键

我需要在hibernate应用程序模型中将外键列作为主键。当我设置@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) 个答案

  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;
    
        ...
    }
    
  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;
        ...
    }
    

    我找到了类似的例子here,希望这就是你要找的