2016-08-25 55 views
1
Criteria crit = sess.createCriteria(Cat.class); 
crit.setMaxResults(50); 
List cats = crit.list(); 

cats變成當前會話的持久對象sessHibernate標準加載對象,會使對象變成持久性的嗎?

我查了API,但沒有提及任何東西。我非常擔心這一點,所以我希望我能找到某處正式提及對象是否會持久化,當我第一次使用Hibernate的session加載對象時,我不知道該對象變爲持久對象,並且我意外修改了值在對象內部,更改會刷新到數據庫,這對我來說會造成很大的問題。

在此基礎上https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

org.hibernate.Criteria接口表示反對 特定持久類的一個查詢。

是否表示返回的對象是持久對象?我可以安全地更改對象內的值嗎?

如果對象不會是持久的,爲什麼有一個setReadOnly屬性來控制的API文檔:

設置只讀/修改模式,通過 這個標準裝載實體和代理。此設置將覆蓋 持久性上下文的默認設置。

以上我很困惑!

回答

1

它會在當前會話中持續存在。如果您更改對象值並刷新,則在事務結束時將其保存到數據庫中。檢查https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/objectstate.html段落10.4.1。執行查詢

查詢通常通過調用list()來執行。 查詢的結果將被完全加載到內存中的一個集合中。由查詢檢索的實體 處於持久狀態。

+0

這太糟糕了......你知道我怎樣才能通過Hibernate獲取數據,但他們不處於持久狀態?這是非常危險的,如果有人不知道並意外地衝洗它... – GMsoF

+0

從會話分離對象或使session.setDefaultReadOnly(true)。詳細的選項可以發現:http://stackoverflow.com/questions/5800814/is-it-possible-to-detach-hibernate-entity-so-that-c​​hanges-to-object-are-not-aut – Justas

+0

謝謝你分享。太糟糕了,如果我們總是需要在數據加載後分離,那太麻煩了。使用'setDefaultReadOnly'將刪除所有的持久對象,而不是特定的對象。除此之外,hibernate沒有任何加載數據的方法會自動變成非持久對象? – GMsoF