我有Hibernate實體,我必須轉換爲JSON,我必須在實體中翻譯一些值,但是當我翻譯值時,這些值會立即保存到數據庫,但我不想將這些更改保存到數據庫。有沒有解決這個問題的方法?是否可以分離Hibernate實體,以便更改對象不會自動保存到數據庫中?
39
A
回答
36
您可以通過致電Session.evict()
來分離實體。
其他選項是在轉換值之前創建實體的防禦副本,或者在代碼中使用DTO而不是實體。我認爲這些選項更優雅,因爲它們不轉換到JSON和持久層。
0
關閉會話。這會讓你的實體分離,並且不會進行修改。如果這是不可能的,查看禁用autoFlush ...但這是一個其他的蠕蟲。最簡單的就是關閉會議並完成它!
3
我也在將Hibernate實體轉換爲JSON。
當你關閉會話時你不能延遲加載對象的壞處。因此,您可以使用
hSession.setDefaultReadOnly(true);
並在您完成JSON後關閉會話。
3
您還可以避免通過使用您的實體連接到Hibernate會話StatelessSession
:的
StatelessSession session = sessionFactory.openStatelessSession();
代替
Session session = sessionFactory.getCurrentSession();
請注意,你必須要小心關閉StatelessSession
的自己,不像常規休眠會話:
session.close(); // do this after you are done with the session
與常規會話相比的另一個區別是StatelessSession
無法提取集合。我看到它的主要目的是獲取數據,只有SQLQuery
的東西。
您可以在此處詳細瞭解不同的會話類型:
0
public static <E> E deepClone(E e) {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo;
try {
oo = new ObjectOutputStream(bo);
oo.writeObject(e);
} catch (IOException ex) {
ex.printStackTrace();
}
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi;
try {
oi = new ObjectInputStream(bi);
return (E) (oi.readObject());
} catch (IOException ex) {
ex.printStackTrace();
return null;
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return null;
}
}
第一:deepClone會議POJO
第二:改變場
然後:做任何你想做的事情
相關問題
- 1. 是否有可能更新保存在ObjectContext中的對象以便重用而不保存到數據庫?
- 2. 實體框架不會將對象保存到數據庫
- 3. 數據存儲不會將新更改保存到實體中
- 4. 實體框架不會保存數據庫中的更改
- 5. 實體框架 - 保存對分離實體所做的更改
- 6. 是否可以在NW.js中離線保存html元素更改?
- 7. 是否可以更改內存中的活動記錄關聯而不將其保存到數據庫中?
- 8. 窗體中的更改不會保存到數據庫
- 9. 更新分離對象時,Hibernate是否可以刪除孤立的集合?
- 10. 將對實體模型的更改保存到數據庫
- 11. 是否可以在php中的會話中保存mysql對象?
- 12. 實體框架不保存對數據庫的更改
- 13. 是否可以自動更改svn存儲庫佈局?
- 14. 對象是否可以更改爲不同類的實例?
- 15. 用Graph可以更新保存到我的數據庫中的實體嗎?
- 16. 實體框架不保存更改到數據庫
- 17. 在更新父對象時可以休眠保存新實體
- 18. 實體框架 - 保存對分離狀態的相關對象的更改
- 19. 我可以查詢mysql數據庫但不保存更改
- 20. 無法將實體對象保存到數據庫中
- 21. hibernate是否可以創建數據庫和數據庫用戶?
- 22. 我可以從EntityManager中自動分離SqlResultSetMapping實體嗎?
- 23. 無法使用Hibernate將實體保存到數據庫中
- 24. 如何將對象保存到文件中,以便以後可以加載它?
- 25. 是否可以自動檢索數據庫中的數據?
- 26. 是否可以通過C#Remoting保存對象實例?
- 27. 實體框架 - 只保留對數據庫的部分更改
- 28. 您可以緩存數據以便以後離線查看嗎?
- 29. 是否可以將XpsDocuments序列化爲XML以便存儲在數據庫中?
- 30. LINQ到實體:添加對象不保存更改
對於JPA,您可以使用: ['EntityManager.detach(object)'](http://docs.oracle.com/javaee/7/api/javax/persistence/E ntityManager.html#detach%28java.lang.Object%29) – 2014-01-13 13:48:39
我總是使用DTO來達到這個目的。使用防禦副本是個好主意,但是今年的維護變得更加困難,人們認爲新的對象是一個託管的對象,但實際上它實際上是一個本地副本。 – VimalKumar 2015-07-29 19:47:13
EntityManager.detach(變量)也適用於我 – kiedysktos 2017-01-27 14:23:06