假设我们有以下医疗状况:
3个实体: 咨询,带有一个可为空的处方。 包含一套药物的处方。
我将它们建模如下:(Java 代码删除了不必要的信息)
Consultation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "consultation")
@JoinColumn(name = "prescription_id")
private Prescription prescription;
}
Prescription {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "consultation_id")
private Consultation consultation;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "prescription")
private Set<Medicine> medicines;
}
Medicine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "prescription_id")
private Prescription prescription;
}
问题:
当我调用entityManager.persist(consultation)时,所有子实体都以级联形式保存:处方和药物组,在各自的表中。问题是所有外键值都为空。
- consultation.prescription_id = null
- prescription.consultation_id = null
- medicine.prescription_id = null
Hibernate HQL 日志:
insert into PRESCRIPTIONS (consultation_id, prescription_type) values (?, ?)
insert into MEDICINES (description, name, prescription_id) values (?, ?, ?)
insert into CONSULTATIONS (cost, date_occured, description, diagnosis, employee_id, patient_id, reference_id) values (?, ?, ?, ?, ?, ?, ?)
我对级联机制有什么误解?
最佳答案
您似乎没有更新关联的所有者方;当将关联刷新到数据库时,Hibernate 不会检查反面。
确保正确更新处方
中的咨询
字段和医学
中的处方
字段。
级联与关联的归属无关;它只是确定哪个实体生命周期操作被级联到关联实体。
关于java - Hibernate级联多层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231398/