2014-03-12 86 views
0

我希望有人能幫我解決這個問題 我正在使用spring和JPA來保存數據。 當我嘗試保存調用我的DAO時,並非所有數據都被保存。在JPA更新/保存數據JPA

考慮以下結構

class User 
var name 
var surname 

@OneToMany(mappedBy = "rule",cascade = CascadeType.PERSIST) 
@Fetch(FetchMode.SUBSELECT) 
set<Address> address; 

@OneToMany(mappedBy = "rule",cascade = CascadeType.PERSIST) 
@Fetch(FetchMode.SUBSELECT) 
set<Job>job; 


class Address 
List<AddressList>addressList; 

class Job 
List<JobList>jobList; 

什麼基本情況是,名字和姓氏的變化,但如果我涉及到的地址或工作類中的任何改變,這些都沒有提交。 但是,如果我刪除用戶,它的工作原理,如果我檢索用戶信息(地址,作業),這些都可以正確檢索。

有什麼建議可能是什麼問題?

+0

它看起來像你的地址或工作表有隻讀可能?你認爲我有什麼錯誤或例外嗎? –

+0

我做了一些更改,現在我收到以下錯誤: org.hibernate.TransientObjectException:object是未保存的瞬態實例 - 在合併之前保存瞬態實例 如果集cascadeType設置爲Persist,則會發生這種情況;如果我將它們設置爲合併或全部,那麼沒有錯誤,但所有子元素都會被刪除,就像我之前對使用cascadeType.MERGE – cpu2007

回答

0

你只能級聯持久化操作。當你更新一個已經存在的實體時,合併操作將被執行。所以,我建議也可以級聯合並操作:CascadeType.MERGE如果您想在更新時保存相關實體。

+0

的建議所解釋的那樣。我更改了所有 @OneToMany(mappedBy =「rule」,cascade = CascadeType.PERSIST) 到 @OneToMany(mappedBy =「rule」,cascade = CascadeType.MERGE) 但現在發生的情況是數據不僅沒有存儲,而且正在被刪除 我有一個用戶有1個地址和2個工作 我增加了一個地址,兩個工作消失了,額外的地址沒有被添加,但那裏的地址仍然存在。 – cpu2007

0

嘗試cascade type all --- CascadeType.ALL。

對於孤兒清除應該使用:

CascadeType.DELETE_ORPHAN - 如果使用的是冬眠

orphanRemoval =真 - 如果使用的是JPA 2.0

手工清除 - 如果沒有上述的應用

0

是否已經decalre你的瞬態物體@Transient? OK順便說一句 -

follw下面的步驟:

  1. 聲明你teansient對象作爲@Transient

  2. 使用級聯型全--- CascadeType.ALL

  3. 嘗試使用entityManager.flush()刷新您的entitymanager,然後執行persist()merge()操作。