2011-07-09 12 views
4

私はセットアップにとの双方向の1対多の関係をしようとしているとして、1と休止状態:「1」親としての双方向の1対多の親

は私が親を持っている:

@Entity 
public class VideoOnDemand { 

    @OneToMany(cascade = CascadeType.ALL) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    @JoinColumn(name = "video_id") 
    private List<CuePoint> cuePoints = new ArrayList<CuePoint>(); 
} 

と子:

@Entity 
public class CuePoint { 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "video_id", insertable = false, updatable = false) 
    private VideoOnDemand video; 
} 

私は公式にHibernate documentation(2.2.5.3.1.1)から推薦を使用。しかし、HibernateはCuePointが子エンティティであることを理解していないようです。したがって、CuePointを削除すると、VideoOnDemandも他のすべてのCuePointsも削除されます。

私は間違って何をしていますか、正しい方法は何ですか?

答えて

6

これを行うと、2つの一方向の関連付けとして一意の双方向の関連付けがマップされます。側面の一つは、他の逆数としてマークされている必要があります

@Entity 
public class VideoOnDemand { 

    @OneToMany(mappedBy = "video", cascade = CascadeType.ALL) 
    private List<CuePoint> cuePoints = new ArrayList<CuePoint>(); 
} 

@Entity 
public class CuePoint { 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "video_id", insertable = false, updatable = false) 
    private VideoOnDemand video; 
} 

mappedBy属性は、関連の反対側の属性の名前が含まれている必要があります。

実際これは2.2.5.3.1.1項に記載されていることに注意してください。のドキュメントです。

+0

JBは、あなたが言ったことを試しました。この場合、VideoOnDemandは親ではなく子になります。ドキュメントでは、「双方向の1対多のマッピングを所有側として** 1対多の側で**するには、mappedBy要素**を削除し、many to one @JoinColumnを以下のように設定する必要があります。挿入可能であり、偽に更新可能です。本当に、私がCuePointを削除すると、VideoOnDemandはまだ削除されています。さらに、新しいCuePointを追加すると、 'video_id'の列は空になります(以前はそうではありませんでした)。 – weekens

+3

Hibernateには、子と親という概念はありません。所有側の概念があります。なぜあなたは片側を所有側にしたいのですか?あなたの質問に記述するカスケードの削除は、関係の両側に置かれたカスケード= ALLの単純な原因であることに注意してください。外部キーがnullになるのは、cuePointをリストに追加するときにcuePointのビデオプロパティを設定しなかったことが原因です。アソシエーションの両側を初期化する必要があります。それは、Hibernateが関連が存在するかどうかを判断するために使用される所有側です。 –

+0

はい、**所有サイド**は鍵です。私はそれが親子関係だと思った。今私はそれが本当に何を意味するのか知っています。 Ok、CascadeType.ALLをCuePointから削除するだけです。実際、CuePointでビデオプロパティを設定しましたが、注釈が間違っていました。ありがとう、JB! – weekens

関連する問題