Hibernate级联多个层

时间:2015-07-05 14:31:47

标签: java hibernate jpa

我们假设我们有以下医疗情况:

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(咨询)时,所有子实体都以级联方式保存:处方药和药品集,在各自的表中。问题是所有外键值都为空。

  1. consultation.prescription_id = null
  2. prescription.consultation_id = null
  3. medicine.prescription_id = null
  4. 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 (?, ?, ?, ?, ?, ?, ?)
    

    我在级联机制中误解了什么?

1 个答案:

答案 0 :(得分:2)

您似乎没有更新协会的所有者方面;在刷新与数据库的关联时,Hibernate不会检查反面。

确保正确更新consultation中的Prescription字段和prescription中的Medicine字段。

级联与关联的所有权无关;它只是确定哪个实体生命周期操作级联到关联实体。