在Hibernate中query.uniqueResult()和session.load()之间有什么区别?

Moh*_*yan 6 java hibernate

谁能告诉我这段代码有什么区别:

// This following method checks if there is an open session
// and if yes - returns it,  if not - opens a new session. 
Session session = getSession();
Query query = session.createQuery("from Entity e where e.id = 1");
Entity object = (Entity)query.uniqueResult(); 
Run Code Online (Sandbox Code Playgroud)

还有这个:

 Session session = getSession();
 Entity object = (Entity)session.load(Entity.class, new Integer(1));
Run Code Online (Sandbox Code Playgroud)


第一个方法是否返回代理对象?如果我再次调用它,它会打到数据库吗?

Max*_*nzo 10

存在一些差异(从Hibernate 5.2.6开始).

session.load()

  • 它仅通过id搜索,假设实体存在
  • 它总是会返回一个" 代理 "(Hibernate术语)而不会访问数据库.在Hibernate中,proxy是一个具有给定标识符值的对象,它的属性尚未初始化,它看起来像一个临时假对象.
  • 仅用于检索您假定存在的实例,其中不存在将是ObjectNotFoundException.


query.uniqueResult()

  • 您可以使用复杂条件查询,而不仅仅是id
  • 返回与查询匹配的单个实例的便捷方法,或者null查询未返回结果的方便方法.
  • 它将返回一个实体,其集合初始化或不取决于FetchType.