复合键休眠

时间:2015-10-12 14:55:33

标签: java hibernate jpa

我有四个复合键的实体。由于Hibernate无法使用复合键生成实体,因此我必须手动执行。这就是我尝试的方式:

@Entity
@IdClass(ExamRequisitionPK.class)
@Table(name="ExamRequisitions")
@NamedQuery(name="ExamRequisition.findAll", query="SELECT er FROM  ExamRequisition er")
public class ExamRequisition implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)   
    @Column(unique=true, nullable=false)
    private int id;

    @Id
    @Column(nullable=false)
    @OneToOne
    @JoinColumn(name="examId", nullable=false, insertable=false, updatable=false)
    private Exam exam;

    @Id 
    @Column(nullable=false)
    @OneToOne
    @JoinColumn(name="patientId", nullable=false, insertable=false, updatable=false)
    private Patient patient;

    @Id
    @Column(nullable=false)
    @OneToOne
    @JoinColumn(name="doctorId", nullable=false, insertable=false, updatable=false)
    private Doctor doctor;

通过映射此实体,我应该在IdClass(ExamREquisitionPK.class)中放入什么? 我是这样的新手,如果有人可以帮助我会很棒。

1 个答案:

答案 0 :(得分:1)

基本上,这是规则:

  
      
  • 从属实体可能有多个父实体(即,派生标识符可能包含多个外键)。
  •   
  • 如果实体类有多个id属性,那么它不仅必须使用id类,还必须有相应的属性   id类中与id中的每个id属性相同的名称   实体。
  •   
  • 实体中的Id属性可能是简单类型,也可能是实体类型,是多对一或一对一的目标   关系。
  •   
  • 如果实体中的id属性是简单类型,则id类中匹配属性的类型必须相同   简单类型。
  •   
  • 如果实体中的id属性是关系,则id类中匹配属性的类型与   关系中目标实体的主键类型(是否为   主键类型是简单类型,id类或嵌入式id   类)。
  •   

我没有看到ExamPatientDoctor实体类的代码,但我想通过提供示例代码来做出假设:

@Entity
public class Exam {

    @Id
    private String examId;
    ...
}

@Entity
public class Patient {

    @Id
    private Long patientId;
    ...
}

@Entity
public class Doctor {

    @Id
    private Integer doctorId;
    ...
}

鉴于以上代码显示了每个实体主键的类型,以下是您应该在ExamREquisitionPK.class中添加的内容:

public class ExamREquisitionPK {
    private int id; // matches the name of ExamRequisition 1st @Id attribute
    private String exam; // matches the name ExamRequisition 2nd @Id attribute but type should match with Exam's PK
    private Long patient; // matches the name ExamRequisition 3rd @Id attribute but type should match with Patient's PK
    private Integer doctor; // matches the name ExamRequisition 4th @Id attribute but type should match with Doctor's PK
}