2012-03-08 24 views
1

私は、CascadeType.Allで注釈が付けられたクリップのコレクションを所有するPlaylistエンティティを持っています。実際、それは双方向の関係ですが、私はカスケードを避けるために単方向性を定義しました。そのため、クリップにはplaylistIdの整数プロパティがあり、プレイリストへの参照ではありません。クリップはプレイリストの一部として定義されているため、プレイリストなしでは存在できません。したがって、DBの 'Playlist_ID'列はnot-nullとgetPlayListId()も定義されています。私がコレクションからアイテムを削除すると、カスケードはそれを関係の削除とみなしますが、エンティティの削除は考慮しません。私の場合、カスケードはPlaylist_ID列をnullに設定しようとし、制約違反を引き起こすため、問題です。 Hibernateは子エンティティをnullで更新し、削除しない、強制する方法は?

コードが必要です:
playlist.getClips()。remove(0); dao.update(プレイリスト)
はクリップを削除します。それを行う方法はありますか?

+0

私はエンティティとマッピングを表示できます – simonC

答えて

1

あなたはorphanRemovalを使用する必要があります。

@Entity 
public class Playlist { 

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
private List<Clip> clips; 

} 
+0

私の理解では、orphanRemovalは、プレイリストを削除し、その中のクリップを他のプレイリストにリンクしていない場合、クリップが削除されることを意味します。私の場合、私はプレイリストを削除しません。私のワークフローは:コレクションからクリップを削除し、保存されたコレクションを保持するプレイリストです。この場合、hibernateは削除せずにプレイリストからクリップを切り離そうとします。そのカスケードがクリップを削除したいと思っています。 –

+0

プレイリストとクリップの関係が削除された場合、OrphanRemovalが使用されます。プレイリスト全体を削除することは、もちろんそれが起こったときの1つのユースケースです。リストからクリップを削除する方法は別です。どちらの場合も、orphanRemovalはクリップを削除します。 [JPAドキュメント](http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html)から:_(オプション)削除操作を削除されたエンティティに適用するかどうかを指定します。リレーションシップを削除し、それらのエンティティに削除操作をカスケードします._ –

+0

これは機能しません。 'orphanRemoval'を追加すると、必要に応じて削除アクションがバッチに追加されますが、以前にも更新アクションが追加されていますが、制約違反で失敗します –

1

あなたがinverse=trueの古いHBM表記を使用している場合、それはあなたがそれが仕事をしたいように動作します。 Hibernate Annotationsを使用している場合、inverse=trueという新しい方法は、親側でmappedByを使用することです。

適切なマッピングを使用して、プレイリストメンバーフィールドをクリップオブジェクトに追加します。あなたのプレイリストのエンティティに@JoinColumn注釈がある場合は、それをコメントアウトし、あなたの@OneToMany注釈で、更新しない休止状態、そしてあなたが関係を壊す場合にのみ削除するように指示しますmappedBy="whateverYourPlaylistVariableIsCalled"

のプロパティを追加します。

関連する問題