2013-07-11 87 views
0

代碼保存在同一個實例的多個記錄在Hibernate中

for (int i=0; i<10; i++) { 
     SomeClass anObj = new SomeClass(); 
     anObj.setField(i); 
     anObj.setAnotherField("XYZ"+i); 
     session.save(anObj); 
    } 
    session.getTransaction().commit(); 

是沒有錯誤運行,並添加10行這是我想要的表。 字段的主鍵SomeClass

當我移動之外聲明:

SomeClass anObj = new SomeClass(); 
    for (int i=0; i<10; i++) { 
     anObj.setField(i); 
     anObj.setAnotherField("XYZ"+i); 
     session.save(anObj); 
    } 
    session.getTransaction().commit(); 

我收到「SomeClass的實例的標識被改變」的錯誤。

我從中看到的是,Hibernate在將數據保存到數據庫中之後仍然關注對象的關鍵字段 - 甚至在它應該之後,並且在提交時抱怨它。

我希望我應該留在代碼中的對象一旦我保存它,這是沒有道理的。

我想知道它背後是什麼。

有沒有一種方法 - 一個屬性保存()或另一種保存模式來解決這個問題?我不希望在循環的每次迭代中重新聲明anObj

回答

0

發生什麼事情是在您撥打session.save(anObj)後,實體對象變成了持久對象 - 意味着任何後續對其狀態的修改都將被Hibernate檢測到並同步到數據庫(有時會跟蹤到該對象)。

你或許可以保存多行不通過分離,更新和合併爲每一個新的數據庫行重新創建新的對象,但我會說這違背了使用ORM的目的擺在首位(對象關係映射)。

我相信休眠的目的是使Java程序員可以映射存儲在數據庫行作爲一個Java對象(反之亦然)

+0

THX的答案域對象。那麼在這種情況下 - 是否有辦法將對象直接綁定到某種「保存模式」,以便HN在檢測到發生的所有事情的同時,每次發出新的保存信號那個同樣的東西?否則,核心代碼中的所有干擾都不會帶來太大的收益。 – Roam

+0

我會說你應該考慮一下你的代碼的設計模式。通常,Hibernate是在DAO(數據訪問對象)類中實現的。從數據庫中獲取/更新時,只保留實體持久性,否則應用程序始終與分離的實例一起工作(如果對象被修改,則不需要DB操作) – gerrytan

+0

再次感謝。這是一個很好的角度。 – Roam

相關問題