Hibernate中Session.get()方法和负荷()方法的详细比较

  

<强>一、方法和负载方法的简易理解

  

(1) get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个<代码> org.hibernate.ObjectNotFoundException 异常

  

(2)负荷先到缓存(会话缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到数据库中去找),等后面使用这个代理对象操作的时候,才到数据库中查询,这就是我们常说的负载在默认情况下支持延迟加载(懒惰)

  

(3)先到缓存(会话缓存/二级缓存)中去查,如果没有就到数据库中去查(即马上发出sql)。总之,如果你确定DB中有这个对象就用load(),不确定就用得到()(这样效率高)

  

(4)和负载查询数据库

  

1只如果查询不到数据,get 会返回,null,但是不会报错,,load 如果查询不到数据,则报错<代码> ObjectNotFoundException

  

2只使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select …),如果你使用的是,负载查询数据,(先到一级,二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(懒惰)

  

3只通过修改配置文件(* .hbm.xml文件),我们可以取消懒加载

        & lt;类名="员工"懒=表“false”=霸惫ぁ北?之前      

<强>二,结合缓存技术比较得到和负载区别

  

 Hibernate中Session.get()方法和负荷()方法的详细比较

  

注:一级缓存是必须有的,二级缓存是配置的可选(这里解释的时候默认有二级缓存)

  

1。得到在查询的时候首先到一级缓存(会话级缓存)中查找,没有的话进入二级缓存(介于内存与硬盘之间)如果二级缓存还没有则直接进入数据库中查询!查询到并将查询的结果放入二级缓存!查询不到不会报错,如果查询同一条数据,得到会出现在第一次查询的时候会出查询数据库但是第二次的时候会直接沿着一级缓存,二级缓存查找可以找到。

  

2.负载在查询的时候也是先到一级缓存中查找,如果找到则不会查询数据库,如果找不到则依次到二级缓存查找,如果二级缓存中没有查找的数据,让方法会根据是否要立即利用查询的结果,如果不利用的话则停止查找;如果要立即使用的话则会进入数据库中查找;查询到并将查询的结果放入二级缓存!查询不到则会报错!

  

<强>三、深入区别让方法和负载方法

  hibernate

(1)中得到的方法和负载方法的根本区别在于:

  

1。如果你使用负载方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的负载方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。

  

2。由于会话中的缓存对于hibernate来说是个相当廉价的资源,所以在加载时会先查一下会话缓存看看该id对应的对象是否存在,不存在则创建代理,所以如果你知道该id在数据库中一定有对应记录存在就可以使用负载方法来实现延迟加载。

  

3。对于得到的方法,hibernate会确认一下该id对应的数据是否存在,首先在会话缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回零。

  

4.得到方法如果在会话缓存中找到了该id 对应的对象,如果刚好该对象前面是被代理过的,如被加载方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

  

5.得到方法首先查询会话缓存,没有的话查询二级缓存,最后查询数据库;反而负载方法创建时首先查询会话缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

  

(2)总之对于得到和负载的根本区别,一句话,hibernate对于负载方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于得到的方法,hibernate一定要获取到真实的数据,否则返回零。

Hibernate中Session.get()方法和负荷()方法的详细比较