2013-06-04 142 views
3

有A類,如:休眠保存/更新級聯

class A { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "DBId") 
    private Long DBId = null; 

    @OneToMany(cascade = CascadeType.ALL) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    List<B> list; 
} 

和B類像

class B { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "DBId") 
    private Long DBId = null; 
} 

當我想要堅持A類的新實例,兩種情況都是可能的。 1- B在A中的所有實例是新的,在這種情況下,一個簡單的session.save(A)是確定。 2-一些或全部在A中的B的實例是舊的。我應該如何保存A以免重複Bs。請saveOrUpdate解決問題?或者它只是決定選擇保存或只是在尋找一個更新,例如,如果A是新的,它也將呼籲節省燒烤,並且如果是舊的,它也將呼籲更新上燒烤?

此外,我看到我的代碼中只有一個簡單的session.save(A),並且它沒有產生多餘的Bs。我錯了嗎?這可能嗎?

問候

UPDATE:老B的情況下,老B的實例連接到會話,DBID設置正確。

+0

你應該看看Hibernate的痕跡:如果啓用了SQL跟蹤,你會看到Hibernate生成的所有SQL語句,以知道如何處理Bs。 – eternay

+0

是的,我認爲應該saveOrUpdate幫助你。你試過這個嗎? – dosdebug

+0

還沒有。但爲什麼不保存製造問題? – Shayan

回答

2

你的實體比會話壽命長嗎?如果沒有,你不必使用update()saveOrUpdate()。當你調用session.save(),Hibernate知道是否insertupdate,通過檢查實體的狀態。你可以在這裏閱讀關於狀態的更多信息:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#objectstate-overview

這同樣適用於級聯。當操作級聯到集合時,Hibernate將檢查集合中的實體的狀態,並且將NOT嘗試插入它們,如果它們已經處於PERSISTENT狀態。

+0

非常感謝,在鏈接中提到「如果一個父節點被傳遞給save(),update()或者saveOrUpdate(),所有的孩子都被傳遞給saveOrUpdate()」 – Shayan