0

私は冬眠を学び始めました、そして私は単純なグーグルでクリアすることができないいくつかの質問を明らかにしたいと思います。質問は、deleteOrphan、カスケードタイプ、およびさまざまなアソシエーションマッピングタイプの相互作用に関するものです。始めましょう。よろしくお願いします。

@Entity
@Table(name = "t_member", schema = "church")
public class Member implements Serializable {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinTable(name = "t_event_members", joinColumns = {
                    @JoinColumn(name = "member_id")
                }, inverseJoinColumns = {
                    @JoinColumn(name = "event_id")
                })
    private Set<Event> events;
}

@Entity
@Table(name = "t_event", schema = "church")
public class Event implements Serializable {
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "events", 
            cascade = CascadeType.ALL)
        private Set<Member> members;
}
  1. メンバーは所有側です。アクティブなセッション中に、メンバーを取得します。メンバーコレクションからイベントを削除してsaveOrUpdateを実行すると、対応するメンバーがイベントから削除されますか?
  2. この場合、「所有側」はカスケードにどのように影響しますか?
  3. orphanDeleteとCascadeTypeを混在させるとどうなりますか?
4

1 に答える 1

1

1) この場合、孤立した削除をマップしていないため、メンバーからイベントを単に削除しても効果はありません。Member からイベントを削除すると、そのイベントは孤立したままになります。これが、「孤立した削除」という用語の基礎となっています。また、「アクティブなセッション中にメンバーを取得した」ため、そのメンバーは「管理」されています。saveOrUpdate を呼び出す必要はありません。管理対象オブジェクトの状態は、Hibernate によって追跡されます。

2) ほとんどのカスケード型は、関連付けのどちら側でも有効です (orphan-delete は例外です)。カスケードとは、あるものに対して実行されたばかりの操作を別のものにカスケードすることです。所有するかどうかは、Hibernate がデータベース内のその関連付けの状態を駆動するためにどちらの側を使用するかを示します。この最後の点を説明するために、ここでは双方向の多対多があります。「t_event_members」テーブルの行は、メモリ内で 2 回表されます。1 回目は Member.events の要素として、2 回目は Event.members の要素として表されます。所有するということは、基本的に、これら 2 つが異なる可能性がある場合に、どちらを信頼するかを定義します。

3) orphan delete は、実際には Hibernate へのカスケード タイプです。JPA はカスケード型とは別に (アノテーション属性として) 定義しているため、明らかにそれもサポートしています。

ところで、孤立した削除と多対多には互換性がありません。

于 2012-08-14T13:29:38.323 に答える