2012-04-23 64 views
15

之前保存的瞬態的實例我有兩個實體:PlayerProfileEntity & UserInfoEntity 我有userInfoEntity聯接& PlaterProfileEntity和保存我的記錄數據庫是這樣的:對象引用一個未保存的瞬態的實例:沖洗

Session session = sessionFactory.openSession(); 
Transaction tr = session.beginTransaction(); 
Criteria crit = session.createCriteria(PlayerProfileEntity.class); 
player.setUserId(new UserInfoEntity()); 
player.getUserId().setAddress(user.getUserId().getAddress()); 
session.save(player); 
tr.commit(); 

我在我PlayerProfileEntity類使用該assosiation

@ManyToOne (fetch = FetchType.LAZY) 
@Cascade({CascadeType.REFRESH}) 
@JoinColumn(name="userid") 

我收到此錯誤:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save  the transient instance before flushing: com.shared.entity.UserInfoEntity 

注:如果我使用CascadeType.All,我得到這個錯誤:

Cannot add or update a child row: a foreign key constraint fails 

任何想法我怎麼能解決這個

感謝

回答

20

每當您嘗試保存對象而沒有保存相應的連接時,都會出現TransientObjectException。您必須sav首先UserInfoEntity,然後你可以保存你的PlayerInfoEntity類。

player.setUserId(new UserInfoEntity()); 

利用這一點,你要分配特別UserInfoEntityPlayerInfoEntity。但UserInfoEntity沒有任何ID。兩者如何被映射?這就是例外即將到來的原因。

希望它能幫助你。

+0

謝謝,你能指導我如何保存userInfoEntity – user1226162 2012-04-23 13:25:44

2

您應該使用CascadeType.PERSIST或CascadeType.ALL

+0

謝謝,但我已經使用CascadeType.ALL,在我的問題中提到,並得到錯誤:無法添加或更新子行:外鍵約束失敗,任何想法 – user1226162 2012-04-23 10:13:58

+0

對不起,沒有' t最後看到註釋。但我認爲,我們應該專注於您使用CascadeType.ALL獲得的錯誤。 – 2012-04-23 10:31:57

+0

您顯示了一條涉及'Criteria'的行,但它與您的代碼無關。另一方面,它缺少重要的代碼來組裝你將要保存的'Player'。另外,這一行讓我困惑:'player.getUserId()。setAddress(user.getUserId()。getAddress())'那有什麼意義?那麼UserId是一個複合對象? – 2012-04-23 10:37:39

-1

好,

我有simmilar問題,我所做的就是

Object tmp = session.get(Object.class,ob.getId()) 
if(tmp!=null){ 
    session.evit(tmp); // or merge 
} 
session.saveOrUpdate(ob); 

這爲我工作。

它獲取瞬態對象並驅逐或合併它。

現在使用保存或更新方法來保存您的新對象。

+1

你需要解釋更多關於這個解決方案。如何拯救解決這個問題。通常,這個問題是由於*不*保存附加到正在保存的當前實體的實體引起的。 – 2012-04-23 17:18:25

1
public void savePlayerMethod(PlayerInfoEntity player){ 

if(player == null){ 
    player = new PlayerInfoEntity(); 
} 
player.setUserId(getSavedUserInfo()); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 

public UserInfoEntity getSavedUserInfo(){ 
UserInfoEntity userInfo = new UserInfoEntity(); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 
0

當試圖通過Session#save()方法存儲具有指定ID的未保存對象時,我剛纔遇到了同樣的錯誤。我認爲問題可能是您的未保存的對象圖已經被賦予了一個id(這是save-method試圖做的事情),並且這不知何故地攪亂了save-method的級聯。嘗試使用Session#persist()代替,即使對象已經被分配了一個id,級聯也應該與此一起工作。