java - Hibernate级联多层

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

  1. consultation.prescription_id = null
  2. prescription.consultation_id = null
  3. 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/

相关文章:

java - evictAll 和刷新之间的区别

java - Spring Boot + JPA + Hibernate 不同表名前缀

java - Hibernate saveorupdate 或 merge 用于保存/更新一对多关系对象

java - 如何实现基本的 2d 图形/在 java 中使用它们

java - 如何使用 PHP 执行 java -jar 文件,并将 .jar 创建的文件加载到服务器?

java - Spring Data JpaRepositories 的 LazyInitializationException

java - JPA 以编程方式添加监听器

java - 创建一个 ImageIcon,它是另一个 ImageIcon 的镜像

java - 具有计数条件的 Hibernate 条件

java - @SqlResultSetMapping 和 @Embedded