2009-06-04 11 views
4

を削除し、私のデータモデル(簡体字)、順序は、ここでのクエリ

public class AddressBook { 
    private List<Group> groups = new ArrayList<Group>(); 
    private List<People> peoples = new ArrayList<People>(); 

    @OneToMany(mappedBy = "addressbook", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    public List<Group> getGroups() { 
     return groups; 
    } 

    @OneToMany(mappedBy = "addressbook", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    public List<People> getPeoples() { 
     return peoples; 
    } 
} 


public class Group { 
    private AddressBook addressBook; 


    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    public void setAddressBook(AddressBook addressBook) { 
     this.addressBook = addressBook; 
    } 
} 

public class People { 
    private AddressBook addressBook; 
    private Group group; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    public AddressBook getAddressBook() { 
     return addressBook; 
    } 
    public Group getGroup() { 
     return group; 
    } 
} 

である私は私のアドレス帳から完全なグループを削除すると、このグループに属するすべての人々。だから私のような何かを:

adressBook.getPeople().removeAll(peopleBelongingToGroupA); 
adressBook.getGroups().remove(groupA); 

しかし、私のトランザクションがコミットされたときに、Hibernateはまずありません:

代わりに最初の人々を削除する
delete from groups where groupName='groupA'; 

。そのため、人とグループの間のFOREIGN_KEY制約が違反されます。

最初に人を削除してからグループを削除するには、休止状態にする方法はありますか?私のモデルに欠陥がありますか?すなわち、カスケード= "削除":

答えて

2

各@ManyToOneにカスケードを設定してみましたか?あなたは多くの点で、アドレスブック上のカスケード削除のみを指定しました。このプロパティは、私が信じる各協会のためのものです。

EJB3.0仕様は、これらのBeanを記述する際に手を携える価値があります。 http://jcp.org/en/jsr/detail?id=220

更新: データモデルをもう一度読んで、ここにその動作を説明する注釈がない可能性があります。人→グループとのリンクをカスケード設定しましたか?これは、最初の文が最初にグループを削除しようとすることから始まる理由を説明します。おそらく、カスケードしていない人々のグループのための注釈が必要でしょうか?

1

は、2つのオプション

1)あなたのマッピングに 'カスケード' を追加)

2削除秒前にコール・フラッシュがあります。グループを削除すると、そのグループのメンバーも削除されます。

+0

グループと人物の間でカスケード削除を追加するにはどうすればよいですか? –

0

2つのトランザクションとして行うことも、前述のようにcascade = deleteを使用することもできます。実際には、カスケード削除を実行する孤児を削除することをお勧めしますが、完全に孤立している場合にのみ削除します。これは2良いことを行います:

1)あなたが行うのは、グループを削除して、自動的に子供を削除することです(マッピングが正しく設定されていると仮定して)。 2)Personが複数のグループに属している場合、そのPerson Personオブジェクトは孤立している場合のみ削除されます。つまり、グループがそれを参照していないことを意味します。

子オブジェクト(この場合はPerson)が複数の親を持つことができるため、親関係がすべて削除されない限り、その子は削除しないでください。

関連する問題