2014-02-22 40 views
0

我想訪問創建它的事務內部的映射對象以創建它的克隆。我想通過Hibernate Session而不是僅僅使用Object.clone()(長篇故事...)來克隆它。在創建它的事務內部訪問Hibernate映射對象

Transaction tran = session.beginTransaction(); 

Gadget gadg = new Gadget(1 /* id */, "Gadget Name", "some label", 123); 

session.save(gadg); 

//this returns null 
Gadget gadgClone = (Gadget)session.get(Gadget.class, gadg.getId()); 

//do something with the clone 

tran.commit(); 

但是,gadgClone爲空。是因爲它還沒有被提交?在提交之前是否有辦法使其可在session中訪問?

回答

0

爲什麼不在持久化之前克隆對象? 爲什麼在取消它之後克隆它?...

無論如何,你是否試圖從緩存中加載對象?出於性能原因,如果對象駐留在緩存中,則不需要訪問數據庫。

Gadget savedGadg = (Gadget) session.load(Gadget.class, gadg.getId()); 

此外,您可能需要在提交事務之前初始化對象(也可能是它的字段)。

Hibernate.initialize(savedGadg); 
Hibernate.initialize(savedGadg.getCertainCollection()); 
+0

我需要從Hibernate中獲得一個克隆。有一個原因,但解釋太長而且令人困惑 – amphibient

+0

可能是由於Hibernate在保存對象時失敗。任何堆棧跟蹤?...通過將Hibernate.show_sql設置爲true以及P6Spy來監視HQL可以幫助您確定發生了什麼問題,因爲Hibernate會持續存在您的對象:) – 2014-02-22 00:46:11