2017-08-01 8 views
0

を削除私はは、持続性でJPA子エンティティを削除することはできません

Query q = em.createQuery("DELETE FROM Cities WHERE id = :id"); 

のようなプレーンなHQLで任意の行を削除することができますしかし、私は

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

これらの変更後に結果が届きます。 try { 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が動作する可能性があります。そのため、カントリー(およびその都市への参照)は存在せず、コミット時にチェックされません。それが動作している間、それは頼るのが賢明ではありません

関連する問題