我有四个复合键的实体。由于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)中放入什么? 我是这样的新手,如果有人可以帮助我会很棒。
答案 0 :(得分:1)
基本上,这是规则:
- 从属实体可能有多个父实体(即,派生标识符可能包含多个外键)。
- 如果实体类有多个id属性,那么它不仅必须使用id类,还必须有相应的属性 id类中与id中的每个id属性相同的名称 实体。
- 实体中的Id属性可能是简单类型,也可能是实体类型,是多对一或一对一的目标 关系。
- 如果实体中的id属性是简单类型,则id类中匹配属性的类型必须相同 简单类型。
- 如果实体中的id属性是关系,则id类中匹配属性的类型与 关系中目标实体的主键类型(是否为 主键类型是简单类型,id类或嵌入式id 类)。
我没有看到Exam
,Patient
和Doctor
实体类的代码,但我想通过提供示例代码来做出假设:
@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
}