无法通过持久性删除删除 jpa 子实体
Posted
技术标签:
【中文标题】无法通过持久性删除删除 jpa 子实体【英文标题】:Cannot remove jpa child entity by persistance remove 【发布时间】:2017-08-01 23:47:35 【问题描述】:我可以通过普通的 HQL 删除任何行,例如
Query q = em.createQuery("DELETE FROM Cities WHERE id = :id");
但我想删除它像
Cities city = em.getReference(Cities.class, 8);
try
em.getTransaction().begin();
em.remove(city);
em.getTransaction().commit();
catch(RuntimeException e)
e.printStackTrace();
em.getTransaction().rollback();
我没有收到任何警告或错误
模型很简单
国家(仅限 OneToMany 注释)
@OneToMany(mappedBy = "country", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private List<Cities> cities;
城市(仅限 fk 字段)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "country_id", nullable = false)
private Countries country;
我正在尝试的事情是:
1) trying to apply orphanRemoval = true
2) cascade = CascadeType.MERGE to Cities
3) em.refresh(city)
【问题讨论】:
您是在说“我没有收到任何警告或错误”,因此系统没有出现任何错误。那么问题是什么? 我在这些更改后达到了结果:try em.getTransaction().begin(); city.setCountries(null); em.refresh(城市); em.remove(城市); em.getTransaction().commit(); catch(RuntimeException e) e.printStackTrace(); em.getTransaction().rollback(); 问题是为什么子实体中没有删除不删除FK并像上面一样刷新:( 【参考方案1】:您正在删除一个城市,但是您对国家/地区对现在已删除城市的引用做了什么?如果这是在持久性单元中,则级联持久/合并选项将导致它被拾取并重新插入,从而撤消所需的删除操作。您必须先取消对该城市的任何引用,然后才能将其删除。您的 JPQL 可能会起作用,因为您没有将任何内容加载到内存中,因此国家(及其对城市的引用)不存在,因此在您提交时未检查。虽然有效,但依赖并不好
【讨论】:
以上是关于无法通过持久性删除删除 jpa 子实体的主要内容,如果未能解决你的问题,请参考以下文章
javax.persistence.EntityNotFoundException:已删除的实体传递给持久化