2017-08-01 135 views
0

我可以通过普通的HQL删除任何行一样无法删除的持久性JPA子实体删除

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) 
+0

你说“我没有任何警告或错误”,因此没有系统工作的错误。那么问题是什么? – Namphibian

+0

我在这些更改后达到结果: 尝试em.getTransaction()。begin(); city.setCountries(null); em.refresh(city); em.remove(city); em.getTransaction()。commit(); } catch(RuntimeException e){ e.printStackTrace(); em.getTransaction()。rollback(); } – Nesquik27

+0

问题是为什么在子实体中没有删除而没有删除FK并且像上面那样刷新它:( – Nesquik27

回答

1

要卸下市,但什么是你国家的参考做那现在去掉了城市?如果这在持久性单元中,级联持久化/合并选项将导致它被拾取并重新插入,从而撤销所需的删除操作。您必须清除对该城市的任何引用,然后才能将其删除。你的JPQL可能工作,因为你没有加载任何东西到内存中,所以国家(及其对城市的引用)不存在,因此当你提交时没有检查。虽然它的工作原理,但它不是依靠