我在父表和子表之间有一个@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;
}
}
好的,问题很简单:
因为你还没有告诉它。级联操作仅在通过实体管理器方法执行的数据库更新范围内运行,以创建、更新和删除实体。
然而,Hibernate 确实为 JPA 规范提供了供应商特定的扩展,该扩展应该生成具有延迟操作所需的 DDL。
虽然前面的级联类型传播实体状态转换, @OnDelete 级联是 DDL 级别的 FK 功能,它允许您 每当删除父行时,都会删除子记录。
因此,当用 @OnDelete( 动作注释 @ManyToOne 关联时 = OnDeleteAction.CASCADE ),自动模式生成器会将 ON DELETE CASCADE SQL 指令应用于外键声明,如下所示 如下图所示