2011-06-22 4 views
1

@OnDeleteを使用して私の質問を直接聞かせてください。Inventoryエンティティが削除された場合、これと他のInventoryPreferenceエンティティが削除されますか?私はちょうどHibernate's annotations参照からものを理解することはできません..私はそれを正しく理解したことを確認するためにあなたの助けが必要です。CascadeType.ALLと@OnDeleteの違いを理解しようとしています!

public class InventoryPreference { 
    ... 

    @ManyToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @JoinColumn(name = "inventory_id", nullable = false) 
    public Inventory getInventory() { 
     return inventory; 
    } 
} 

は、私はその後、InventoryエンティティにInventoryエンティティが削除された場合に削除されたすべてのInventoryPreference秒を取得するには、あまりにもCascadeType.ALLを使用する必要がありますか?

public class Inventory { 
    ... 

    @OneToMany(mappedBy = "inventory", cascade = CascadeType.ALL) 
    public Set<InventoryPreference> getPreferenceItems() { 
     return preferenceItems; 
    } 
} 

最初の質問がtrueの場合、私はCascadeType.ALLのポイントが表示されていません。それ以外の場合は、Inventoryが削除されたときに、InventoryPreferenceを削除するために指定する必要がある注釈と設定は何ですか?ああ、InventoryPreferenceが削除された場合、Inventoryを削除したくありません。もしそれがあまりにも明白なら、申し訳ありません。

答えて

1

多少の違いがあります。 @OnDeleteはスキーマ生成命令です。これは、外部キー(または方言同等物)のために生成されたDDLの最後に 'delete delete cascade'を追加します。データベースを生成するためにhibernateを使用していない場合は、何もしません。

@OneToManyまたは@ManyToOnecascadeプロパティは、実行時に追加の実際のSQL文を生成するために使用されるものです。それはおそらくあなたが実際に望んでいる、追加の削除ステートメントは、データベーステーブルでオンになってカスケードを削除しないで、子供を削除するには?あなたは在庫を削除するとInventoryPreferencesが削除取得するために何をしたいがある場合は、希望:

@OneToMany(mappedBy = "inventory", cascade = CascadeType.REMOVE, orphanRemoval=true) 
public Set<InventoryPreference> getPreferenceItems() { 
    return preferenceItems; 
} 

そしてもちろんのは、あなたのデザインに応じて、追加のカスケードタイプを追加します。

+0

ありがとうございました!はい、まさに私が欲しいものです。あなたが言ったように '@ OneToMany'にカスケード設定を追加すると、カスケードすることに関して' Inventory'エンティティに何も追加する必要はありませんか? – Rihards

+0

OneToManyはInventoryエンティティにあります:) InventoryをInventoryPreferenceにマッピングするManyToOneに何も追加する必要はありません。私はそれがあなたが意味するものだと思います。 – Affe

+0

ありがとう、もう一度ありがとう!あなたは1時間ごとの長い読書から私の日を救い、悪夢であるHibernateのリファレンスを理解しようとしました! :) – Rihards

関連する問題