hibernate懒加载能用get方法吗

问题描述

hibernate懒加载能用get方法吗

hibernate中的session.load()方法特性是使用懒加载,那么请问hibernate中的session.get()方法在什么情况下也是使用的懒加载?还是说get方法没有懒加载,都是立即加载?看教程的时候发现测试集合的懒加载是用get方法取一对多的一对象而不是load方法

解决方案

http://blog.csdn.net/yaorongwang0521/article/details/7074573

解决方案二:

get和load,
一个是直接加载,并不是直接去数据库查询,如果缓存里有,首先到缓存里找,缓存分为一级缓存和二级缓存,首先到一级缓存中查找;
如果在session关闭之后进行获取类的名字之类的属性,依然会获取到,例:
Order od = (Order) session.get(Order.class, 1);
通过get获取的Order类是一个持久化类,如果session关闭之后进行获取,od.getName,它就会变成托管状态,但是这个对象还是有的,所以没事;
另一个是懒加载,他不会直接进行操作,就是除了获取id(标识符)和类.class时,获取其他的类属性都会进行操作,
例:
Account acc=(Account)session.load(Account.class,new Long(1)); //返回一个代理对象
System.out.println(acc.getId);
System.out.prontln(acc.getLonginName());
这里的1是一个代理对象,如果只获取他的id,则不会加载,不会出现select语句,只有获取除他和本身之外才会进行查找;否则访问的只是他的代理对象而已;如果需要取消懒加载,就只需要在你想获取的类属性的映射文件的把他改为false就可以了,这样懒加载就取消了,这里只对load管用,对get()毫无影响;
如果把他System.out.prontln(acc.getLonginName());放在session关闭之后,则会出现错误,因为这里只产生了一个代理对象,没有真正去查,把session关之后,他会去查数据库,要发出sql语句,因为发出sql语句需要在session里面,所以session关了之后,就不能使用了;
接下来说一说他们之间的区别,
延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。
如果只是访问对象标示符属性,就没有必要初始化代码。
Account acc=(Account)session.load(Account.class,new Long(1)); //返回一个代理对象
Order order=new Order();
order.setCreateTime(new Date());
order.setAccount(acc);
Session.save(order);
在这只需要Account实例来创建一个新的Order订单对象,当调用session.save(order)时,也只需要Account的主标示符值作为外键保存到订单表的对应字段中。这样就少执行一条select语句,从而提高查询效率。
Hibernate中默认采用延迟加载的情况主要有以下几种:
当调用Session上的load()方法加载一个实体时,会采用延迟加载。
当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。(one-to-many)
例:当Client这个类里具有集合属性,
Client client = (Client) session.get(Client.class, 4);
System.out.println(client.getName());
获取他的名字,你会发现只有一条sql语句,因为采用了延迟加载,所以如果想

取消,就在该映射文件下里面把lazy改成false;
当Session加载某个实体时,会对这个实体所单端关联(one-to-one, many-to-one)的另一个实体对象采用延迟加载。
能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。
2、 关闭延迟加载
在加载单个实体时,如果不需要延迟加载,就可以使用session的get()方法。
当Session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这时可以在映射文件中针对 这个集合属性的配置元素(,,…)添加属性lazy=“false”。
当Session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在映射文件中对这个单端关联的配置元素(, )添加属性lazy=“false”。
注意:one-to-one不能有constrained=true

    如果回答对您有帮助,请采纳
时间: 2024-10-04 14:07:55

hibernate懒加载能用get方法吗的相关文章

Hibernate懒加载解析

Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了. 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库.    实现懒加载的前提:  1 实体类不能是final的 2 能实现懒加载的对象都是被CGLIB(反射调用)改

hibernate3-spring mvc OpenSessionInViewFilter hibernate 懒加载问题

问题描述 spring mvc OpenSessionInViewFilter hibernate 懒加载问题 之前做了一个项目是使用 springmvc 加hibernate 做的, 并且使用了 hibernate 的懒加载有用到OpenSessionInViewFilter, 现在做另一个项目, 基础代码都是上个项目的代码: 目前调试在调试权限模块, 核对了上个项目的代码基本完全一致,但是这个项目的老是无法使用懒加载,加载报 org.hibernate.LazyInitializationE

android实现ViewPager懒加载的三种方法

在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPager中本来充满善意的预加载就有点令人不爽了.我们能做的就是屏蔽掉ViewPager的预加载机制.虽然ViewPager中提供的有setOffscreenPageLimit()来控制其预加载的数目,但是当设置为0后我们发现其根本没效果,这个的最小值就是1,也就是你只能最少前后各预加载一页.那么,这时候

springmvc的jackson 和hibernate懒加载问题

问题描述 在springmvc转对象为json时,如果对象有懒加载,会报错.我所知解决办法有两种,但是都不能解决我的问题1.在实体类声明处加上@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})注解(无任何效果)2.使用jackson-module-hibernate,通过objectmapper注册个module解决,但是set集合会报错,单个懒加载对象没问题

hibernate懒加载问题 求救!

问题描述 <hibernate-mapping><classname="model.Team"table="team"lazy="true"><idname="id"><!--id的产生方式是uuid.hex--><generatorclass="uuid.hex"/></id><propertyname="teamNa

spring-关于懒加载异常,请问怎么解决?多谢各位 了

问题描述 关于懒加载异常,请问怎么解决?多谢各位 了 我的数据库语句是from Survey s where s.user.id = ? 出现User 懒加载,我想问除了在User的配置文件中关闭懒加载这个解决方法外 1,还能用什么方法 希望能就此题具体说说 2,为什么这样用不行啊 from Survey s LEFT OUTER JOIN FETCH s.user.id = ? 3,from Survey s where s.user.id = 这句话怎么用嵌套查询 (就是分开s.user.i

lazy-hibernate 懒加载机制及抓取策略

问题描述 hibernate 懒加载机制及抓取策略 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.gycn.model.Hotel.roomTypes, no session or session was closed 出现这种情况是因为用了懒加载,但是有的地方需要加载集合,有的地方则不用,那么lazy这个属性到底要怎么设置呢? 解决方案 抓取策略应

hibernate get方法 懒加载异常

问题描述 hibernate用get方法怎么也懒加载异常呢?情况是这样device类中有个product类 他们的关系是多对一 ,many to one 这里没有显示的写上lazy属性(默认是proxy吧?),不过many-to-one这里确定要懒加载的而现在我想通过get方法得到device对象,在得到product,hibernate为什么会报懒加载异常呢?不是说get不会看懒加载么? 问题补充:可是多对一的一方,其他人想要延时加载啊,毕竟不是每查一个device类就一定要知道product

懒加载session-多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功

问题描述 多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功 最近写了一个多数据源的代码,结果在使用的过程中出现了在一个请求中(方法中)两个数据库交替使用的情况,最后情况是数据库切换不过来 并且在项目配置中有懒加载和OpenSessionInViewFilter 数据库一个为本地数据库一个为基金数据库 要做的事情就是在本地查询到基金代码接着再循环去基金库查询基金数据 中间报错为在本地数据库中查询不到某个表(其实是在基金库中) controller层 @Reque