如何删除 Hibernate 中的所有记录,包括 Child 条记录 (@OneToMany)?
How to delete all records in Hibernate including Child Records (@OneToMany)?
主要实体
public class CustomerAgreement implements Serializable {
@OneToMany(mappedBy = "customerAgreement", orphanRemoval = true, fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private List<CustomerAgreementPeriod> agreementPeriods;
Child实体:
public class CustomerAgreementPeriod implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "CustomerAgreementPeriodSeq", sequenceName = "CUST_AGT_PERIOD_SEQ")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "CustomerAgreementPeriodSeq")
@Column(name = "ID")
private Long id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "CUSTID")
private CustomerAgreement customerAgreement;
主要:
em.getTransaction().begin();
em.createQuery("delete from CustomerAgreement").executeUpdate();
em.getTransaction().commit();
异常:
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (MASTERDATA.FK_J6TS8CGX06F90LLEMER78LFGG) violated - child record found
- 我在其中一个答案中发现 级联在删除 JPQL 中不起作用。。
- 使用 .remove(entity) 似乎不是一个好方法?
- 要删除 child 使用本机查询然后 parent 查询? (我有 5 childs)
- 有人建议不要将级联全部与 orphanremoval=true 一起使用,我已更改为 Cascade.Persist 但同样的例外情况
谁能建议如何从具有上述给定结构的 4-5 个不同表中删除单个查询中的实体,包括 child 个实体。
没有找到合适的方法,所以使用如下本机查询:
public void deleteAllNative() {
em.createNativeQuery("DELETE FROM CUST_AGT_ATT_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_CUSTOM_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_PERIODS_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_ROLES_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGREEMENT_TAB").executeUpdate();
em.flush();
}
我很难过:(
主要实体
public class CustomerAgreement implements Serializable {
@OneToMany(mappedBy = "customerAgreement", orphanRemoval = true, fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private List<CustomerAgreementPeriod> agreementPeriods;
Child实体:
public class CustomerAgreementPeriod implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "CustomerAgreementPeriodSeq", sequenceName = "CUST_AGT_PERIOD_SEQ")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "CustomerAgreementPeriodSeq")
@Column(name = "ID")
private Long id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "CUSTID")
private CustomerAgreement customerAgreement;
主要:
em.getTransaction().begin();
em.createQuery("delete from CustomerAgreement").executeUpdate();
em.getTransaction().commit();
异常:
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (MASTERDATA.FK_J6TS8CGX06F90LLEMER78LFGG) violated - child record found
- 我在其中一个答案中发现 级联在删除 JPQL 中不起作用。。
- 使用 .remove(entity) 似乎不是一个好方法?
- 要删除 child 使用本机查询然后 parent 查询? (我有 5 childs)
- 有人建议不要将级联全部与 orphanremoval=true 一起使用,我已更改为 Cascade.Persist 但同样的例外情况
谁能建议如何从具有上述给定结构的 4-5 个不同表中删除单个查询中的实体,包括 child 个实体。
没有找到合适的方法,所以使用如下本机查询:
public void deleteAllNative() {
em.createNativeQuery("DELETE FROM CUST_AGT_ATT_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_CUSTOM_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_PERIODS_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGT_ROLES_TAB").executeUpdate();
em.createNativeQuery("DELETE FROM CUST_AGREEMENT_TAB").executeUpdate();
em.flush();
}
我很难过:(