2012-03-17 21 views
4

私は次のマッピングがあります、@ManyToMany + @JoinTableマッピングされた関係でJPA:@ManyToMany @JoinTableとしてマップされた関係の暗黙的なカスケード?

@Entity 
@Table(name = "Prequalifications") 
public class Prequalification implements Serializable 
{ 
    ... 

    @ManyToMany 
    @JoinTable(name = "Partnerships", joinColumns = @JoinColumn(name = "prequalification_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "company_id", referencedColumnName = "id")) 
    private Set<Company> companies; 

    ... 
} 

はそれも一種の、関連(リンク)のエンティティ(ここではPartnerships)が自動的に永続化されることを暗黙の削除などではありませんデフォルトで

かかわらず、関係は空のカスケードが

を設定していますか?上記の引用は、 "Pro JPA 2 by Mike Keith"から引用されたものです。上記エンティティ

em.merge(prequalification); 

を実行

は、指定されたカスケード型なし関連パートナーシップを持続ありません。

この暗黙的なカスケードにはが実行されることを修正しましたか?これはどこにも言及されていません。

+0

私はあなたには、いくつかの時点で休止状態に精通していると仮定しています、そしてあなたは、Hibernateを参照し、あなたの質問のための注釈文書を休止することができます。彼らは、関係定義とカスケード操作について非常に詳細な章を持っています。 –

答えて

13

joinテーブルの行は、所有エンティティの一部として挿入/削除されます(双方向の場合はmappedByなし)。したがって、Prequalificationを永続化または削除または更新する場合、結合表の行も挿入または削除されます。

ターゲットの企業オブジェクトはカスケードされません。したがってremove()では削除されません。リストが更新されていれば、orphanRemovlaが設定されていなければ削除されません。永続化もカスケードする必要はありませんが、「切り離された」オブジェクトへの参照がある程度グレーの領域になるとどうなりますか。技術的には、オブジェクトは新しいものであり、その関係はカスケードされていないため、エラーをスローする必要があります。また、制約エラーを挿入して取得しようとする可能性があります。オブジェクトモデルが技術的に無効な状態になっていても、永続性をカスケードする必要はありません。したがって、何が起こるかはプロバイダによって異なる場合があります。

+0

これはまさに私が知りたかったことです、ありがとうございます。 – Kawu

関連する問題