2011-11-09 7 views
0

私は非常に奇妙な状況に陥りました。ManyToMany関係で行が削除されます

@ManyToMany 
     @JoinTable(name="a_b", 
       joinColumns={ 
        @JoinColumn(name="b_id") 
      }, inverseJoinColumns={ 
       @JoinColumn(name="a_id") 
     } 
     ) 
    private List<A> alist; 

私はクラスのインスタンスを更新し、Hibernateはすべて削除されます。

A.class:

@ManyToMany 
    @JoinTable(name="a_b", 
      joinColumns={ 
       @JoinColumn(name="a_id") 
     }, inverseJoinColumns={ 
      @JoinColumn(name="b_id") 
    } 
    ) 
private List<B> blist; 

B.class 私はこのようなクラスAとBと関係多対多を得ましたrelation( 'a_bからの削除a_id =?) 私のデータベースには、カスケード型のルールはありませんでした。 そのような状況の原因は何ですか?

答えて

0

唯一のことは、SaveOrUpdateではなくSaveを使用していることです。それは事実ですか?クラスの注釈はうまく見えますが、問題を引き起こしている何かがあります。もっと情報を投稿できますか?

0

問題は、カスケードタイプを指定しないことです。デフォルトはCascadeType.Noneです。その結果、親IDが変更された更新は子に伝播せず、Hibernateは孤児を削除します。私は、あなたの属性に次のように指定する必要があります信じる:

@ManyToMany(cascade = CascadeType.ALL) //Use whatever CascadeType fits your need 
0

次のマッピング

で試してみてくださいA.class

@ManyToMany(targetEntity = B.class) 
@JoinTable(name = "a_b", 
     joinColumns = @JoinColumn(name = "a_id"), 
     inverseJoinColumns = @JoinColumn(name = "b_id")) 
private List<B> blist; 

B.class

@ManyToMany(mappedBy = "blist", targetEntity = A.class) 
private List<A> alist;