2017-01-09 50 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-它可以是持久性实例或代理。并不总是代理 –

相关问题