2016-10-11 17 views
0

テーブルから子エントリを削除しようとしましたが、私のエンティティは双方向の関係にあります。 親行を削除または更新できません:外部キー制約は失敗します "。 親が自動的に削除された子エントリの関係を削除するときにマッピングが必要です。JPA:親行を削除または更新できません

@Entity 
@Table 
public class RuleModel implements Comparable<RuleModel> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "Rule_Id", unique = true, nullable = false) 
    protected Integer id; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel parent; 

    @OneToOne(fetch = FetchType.EAGER) 
    protected RuleModel child; 
} 
+0

削除前削除ブロックの両方の親と子はnullを設定します306144/jpa-cascadetype-all-does-not-delete-orphans – Zorglube

+0

しかし、私は親エントリを削除したくありません。 – Hammad

+0

あなたの場合は、おそらく 'parent'と' child'が同じオブジェクトを参照しているかもしれません。あなたのコードを確認してください。 –

答えて

0

子を削除する前に、オブジェクト間の関係を解除する必要があります。 http://stackoverflow.com/questions/:

0

私はそうnullに最初の更新関係を休止した後、あなたはcascad降下を設定する必要が

@PreRemove 
public void preRemove() { 

    if (parent != null) { 
     parent.setChild(null); 
    } 
    if (child != null) { 
     child.setParent(null); 
    } 
} 
+1

あなたのデザインはエラーが発生しやすいです。あなたはDBでやっているように、親と子を別々に保存する必要はありません。同じ関係の2つの方向性が良くなるので、単にそれらを扱うことができます。つまり、単に「親」をDBに保存し、それをあなたのエンティティにマッピングすることを意味します。子関係については、 'mappedBy'を使用してください。そして、@ PreRemoveに頼るのではなく、あなたのドメインロジックでこれらを実行してください。あなたは今、その事を削除することができますが、あなたの親は現在、子なしを指しており、あなたの子供は親なしの下にあります。これは、私にはデータの不一致があります。 –

+0

私は双方向リンクリスト – Hammad

+0

を作成していますか?それは実際にはさらに悪いことです。二重リンクされたリストからノードを削除すると、そのノードの次のノードはノードの次のノードを指し、そのノードの前のノードはノードの前のノードを指すはずです。あなたがやっていることは単にリストを破壊することです。そして、私が前のコメントで言ったことは、あなたがしようとしていることと矛盾していません。 DBでは、親IDのみを格納する必要があります。エンティティモデルでは、現在行っていることのような関係の両方向を持つことができます –

関連する問題