2011-12-19 8 views
8

私は、ほぼすべての関係は、以下の注釈を持った上でのコードベースを継承していますJPAのカスケード= REMOVEとHibernateの@OnDeleteを併用していますか?

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing") 
@OnDelete(action = OnDeleteAction.CASCADE) 

は、今私は@OnDeleteが最初の場所で何をするかを理解トラブルを抱えています。 Hibernate: OnDelete vs cascade=CascadeType.REMOVEは興味深いですが、残念なことに答えはなく、@OnDeleteのJavaDocは特に意味がありません。

他の質問から、OnDeleteアノテーションによってDBがカスケード化されているように見えますが、カスケードディレクティブ@OneToManyはORMにしましょう。しかし、それらを一緒に使用する目的は何でしょうか?

@OneToManyのカスケードディレクティブは、ORM実装で実際にDBベースのカスケードを生成できないのですか?

答えて

8

のは、あなたがCascadeType.REMOVEその後、家を削除するともドアを削除します使用する場合は、1対1の方向関係

class House { 

    @OneToOne 
    Object door; 

} 

があるとしましょう。

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

@OnDeleteを使用すると、ドアを削除すると家が削除されます。

よりここ
@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

読む: `@ OneToOne`と` OneToMany` @とhttp://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

+2

動作は全く同じではないようです。 @OneToMany(...)@OnDelete(action = OnDeleteAction.CASCADE)オブジェクトのドアでは、家を削除するとすべてのドアが削除されるようですが、ドアを削除してもその家は削除されないようです。 – Bruno

+0

'@OneToMany List ドア'でなければならないと思います。しかし、それ以外にも、このマッピングは通常Houseテーブルに列を作成しません。あなたは 'Doors.house'の逆マッピング、またはコレクションテーブルを持っています。データベースカスケードの場合、カスケードしたいテーブルにカラムがなければならないと思います。 –

+0

同意しない。ユーザーの視点での '' CascadeType.REMOVE'''と '' @ OnDelete'''の最大の違いは、 '' @ OnDelete''はJPAQL(DBカスケードに基づいているため)、 '' 'CascadeType.REMOVE'''はJPAQLでは動作しません。 – okwap

関連する問題