JPA,删除父级不能删除所有子级

问题描述 投票:0回答:1

我在父表和子表之间有一个@OneToOne关系,如果在父表上发生删除,我需要删除所有子表,因为没有父表,子表没有意义!

父实体:

@Entity(name = "AcqPlan")
@Table(name = "ACQ_PLAN")
@Inheritance(strategy = InheritanceType.JOINED)
public class IRIDE implements MpsIdEntity<Long>{

private static final long serialVersionUID = 1L;

protected HeaderType header;



protected Long id;



@OneToOne(mappedBy = "acqPlan", cascade = {
    CascadeType.ALL
})
public HeaderType getHeader() {
    return header;
}

/**
 * Sets the value of the header property.
 * 
 * @param value
 *     allowed object is
 *     {@link HeaderType }
 *     
 */
public void setHeader(HeaderType value) {
    this.header = value;
}

...

}

子实体:

@Entity(name = "Header")
@Table(name = "HEADER")
public class HeaderType implements MpsIdEntity<Long>{

protected Long id;


protected IRIDE acqPlan;

@OneToOne(optional=false, orphanRemoval = true, cascade = {
    CascadeType.ALL
})
@JoinColumn(name = "AcqPLan_FK",nullable = false)
public IRIDE getAcqPlan() {
    return acqPlan;
}

public void setAcqPlan(IRIDE acqPlan) {
    this.acqPlan = acqPlan;
}

}

好的,问题很简单:

  1. 为什么 ORM 不创建 DDL OnDelete 操作?
  2. 主要问题,为什么我在数据库上运行“delete from acq_plan where acq_plan.id =1;” 我只删除了父级 ( acq_plan) 记录,而没有删除与其相关的标头记录?
jpa one-to-one cascade
1个回答
0
投票

因为你还没有告诉它。级联操作仅在通过实体管理器方法执行的数据库更新范围内运行,以创建、更新和删除实体。

然而,Hibernate 确实为 JPA 规范提供了供应商特定的扩展,该扩展应该生成具有延迟操作所需的 DDL。

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#pc-cascade-on-delete

虽然前面的级联类型传播实体状态转换, @OnDelete 级联是 DDL 级别的 FK 功能,它允许您 每当删除父行时,都会删除子记录。

因此,当用 @OnDelete( 动作注释 @ManyToOne 关联时 = OnDeleteAction.CASCADE ),自动模式生成器会将 ON DELETE CASCADE SQL 指令应用于外键声明,如下所示 如下图所示

© www.soinside.com 2019 - 2024. All rights reserved.