2012-05-11 167 views
13

讓我們有實體A和實體B。實體AB@OneToOne的關係。
我想下一步:
如果我刪除A,那麼B也必須刪除。
如果我刪除B,則A不會被刪除。休眠:級聯型

在哪個實體我必須設置

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 

,並在身邊,我必須設置

@OneToOne(cascade = {CascadeType.ALL}) 

回答

28

從A到B的級聯應放在該領域中A類引用B,從B級聯到A應該放在B類中參考A的字段上。

public class A { 
    @OneToOne(cascade = {CascadeType.ALL}) 
    B b; 
} 

應在A類,只要你想每一個動作被級聯到B

public class B { 
    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
    A a; 
} 

應在B類,如您只需要某些操作級聯到A

+0

什麼是日糧使用CascadeType.MERGE,CascadeType.PERSIST和CascadeType.REFRESH? –

+1

@geceo因爲他們是提問者所要求的級聯:p [here](http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive )是對不同級聯選項的解釋,基本上這些選項與'CascadeType.ALL'相同,但沒有REMOVE或DETACH,因爲提問者不希望這些選項在應用於B時自動應用於A 。 – Lukazoid

3

如果一個「有」 B,那麼你必須在定義CascadeType.ALL:

public class A { 
    // changes to A cascade to B 
    @OneToOne(cascade = {CascadeType.ALL}) 
    B b 
} 
0

如果一個類B類則CascadeType.ALL將在B. 然後

Public Class A 
{ 
    Private B b; 
    @OneToOne(cascade = CascadeType.ALL) 
    public B getB() {  
    return this.b; 
    }  
    public void B(B b) {   
    this.b = b; 
    } 
} 
被[應用荷

更多閱讀this示例