2017-01-09 53 views
2

任何人都可以對我有什麼這兩個代碼之間的區別:什麼是在休眠query.uniqueResult()VS session.load之間的差異

Session session = getSession() ; // this method check if there is an open session return it if it's not open a new session 
Query query =session.createQuery("from Entity e where e.id=1"); 
Entity object = (Entity)query.uniqueResult(); 

和驗證碼:

Session session = getSession() ; // this method check if there is an open session return it if it's not open a new session 
    Entity object = (Entity)session.load(Entity.class, new Integer(1)); 

做的第一種方法返回一個代理對象?如果我再次調用它是否會觸發數據庫?

+0

可能重複[在Hibernate中load()vs get()的優點是什麼?](http://stackoverflow.com/questions/5370482/whats-the-advantage-of-load-vs-get在休眠) – Azodious

+0

這不是確切的重複,但接受的答案也回答你的問題。 – Azodious

+0

@有趣的是它不是關於query.uniqueResual()它是關於session.get()我認爲他們有不同的行爲 –

回答

7

有一些型動物(使用Hibernate的5.2.6):

session.load():

  • 它只能通過ID假設實體存在
  • 它總是會返回一個searchs 「代理」(Hibernate術語),而不觸及數據庫。在Hibernate中,proxy是一個具有給定標識符值的對象,其屬性尚未初始化,它看起來像是一個臨時假對象。
  • 僅用於檢索您認爲存在的實例,其中不存在將是ObjectNotFoundException。

query.uniqueResult():

  • 你可以用複雜的條件查詢,不僅由ID
  • 的便捷方法,返回與查詢匹配的單一實例,或null如果查詢沒有結果返回。
  • 它將根據FetchType返回一個實體,其集合已被初始化或未被初始化。
+0

does query.uniqueResult()返回一個代理對象?如果我爲相同的查詢調用secound時間,它會打到數據庫? –

+0

它會根據緩存配置選擇是否啓動數據庫,您可以爲整個類配置二級緩存或者僅爲某些屬性配置二級緩存。我不確定代理對象,在我的understunding query.uniqueResult()將返回一個代理對象,如果FetchType是懶惰的。 –

+0

https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/Session.html#load-java.lang.Class-java.io.Serializable-它可以是持久性實例或代理。並不總是代理 –

相關問題