三九宝宝网宝宝百科宝宝知识

hibernate延迟加载怎么开启开启

03月27日 编辑 39baobao.com

[怎么远程开启电脑远程开机]条件: 1、网卡开启了网络唤醒 2、主板支持网络唤醒并开启 3、保证电脑属于正常关机的(强制关机或者死机后关机的无法唤醒,因为网卡没有复位) 软件: WOL(Wake-on-Lan) 1、获取计算...+阅读

Hibernate.initialize持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?当元素或者元素的lazy属性为true时,load()orget()orfind()加载这些对象时,Hibernate不会马上产生任何select语句,只是产生一个Obj代理类实例,只有在session没有关闭的情况下运行Obj.getXxx()时才会执行select语句从数据库加载对象,如果没有运行任何Obj.getXxx()方法,而session已经关闭,Obj已成游离状态,此时再运行Obj.getXxx()方法,Hibernate就会抛出"Couldnotinitializeproxy-theowningSessionwascloseed"的异常,是说Obj代理类实例无法被初始化。然而想在Session关闭之前不调用Obj.getXxx()方法而关闭Session之后又要用,此时只要在Session关闭之前调用Hibernate.initialize(Obj)或者Hibernate.initialize(Obj.getXxx())即可,net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显示初始化代理类实例。

在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Objectproxy)方法强制加载这样就相当于动态改变为lazy=false。但在使用时需要注意的一点是:其中的proxy是持久对象的关联对象属性,比如A实体,你要把A的关联实体B也检出,则要写Hibernate.initialize(a.b)。HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。HibernateTemplate的灵活访问方式是通过如下两个方法完成:(1)Objectexecute(HibernateCallbackaction)(2)Listexecute(HibernateCallbackaction)这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。

HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Sessionsession),该方法只有一个参数Session。通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。做分页:publicListfindByPage(finalStringhql,finalintoffset,finalintpageSize){//通过一个HibernateCallback对象来执行查询Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询Listresult=session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize).list();returnresult;}});returnlist;}publicListfindByPage(finalStringhql,finalObjectvalue,finalintoffset,finalintpageSize){//通过一个HibernateCallback对象来执行查询Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询Listresult=session.createQuery(hql)//为hql语句传入参数.setParameter(0,value).setFirstResult(offset).setMaxResults(pageSize).list();returnresult;}});returnlist;}publicListfindByPage(finalStringhql,finalObject[]values,finalintoffset,finalintpageSize){//通过一个HibernateCallback对象来执行查询Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询Queryquery=session.createQuery(hql);//为hql语句传入参数for(inti=0;i

如何理解Hibernate的延迟加载机制

延迟加载

一.什么是懒加载?他的作用?

延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。

Hibernate中主要是通过代理(proxy)机制来实现延迟加载。它的具体过程:Hibernate丛数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不是数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都是默认值;只有在真正需要使用该对象的数据时才创建这个真实对象,真正从数据库中加载它的数据,这样在某些情况下,就可以提高查询效率。

有如下程序代码:

User user=(User)session.load(clazz, id);//直接返回的是代理对象

System.out.println(user.getId());//没有发送sql语句到数据库加载

user.getName();//创建真实的User实例,并发送sql语句到数据库中

注意:1.不能判断User=null;代理对象不可能为空

代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。session关闭之前访问数据库

2.getId()方法不行因为参数为ID,getClass()方法不用访问数据库就可以得到的数据

Hibernate中默认采用延迟加载的情况主要有以下几种

1,当调用session上的load()加载一个实体时,会采用延迟加载。

2,当session加载某个实体时,会对这个实体中的集合属性值采用延迟加载

3当session加载某个实体时,会对这个实体所有单端关联的另一个实体对象采用延迟加载。

二.关闭延迟加载

延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载,如果Hibernate先默认使用延迟加载,而后又必须去数据库加载,反而会降低效率

1. 加载单个实体,如果不需要延迟加载,就可以使用session的get()方法。

2. 当session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这是可以在映射文件中这个集合的配置元素(set bag list)添加属性lazy=false;

3. 当session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在影射文件中针对这个单端关联的配置元素(

三.抓取策略

通过asm和cglib二个包实现;Domain是非final的。

1.session.load懒加载。

2.one-to-one(元素)懒加载:

必需同时满足下面三个条件时才能实现懒加载

(主表不能有constrained=true,所以主表没有懒加载)

lazy!=false 2)constrained=true3)fetch=select

3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select

4.many-to-one (元素) :1)lazy!=false 2)fetch=select

5.many-to-many (元素) :1)lazy!=false 2)fetch=select

6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

以下为关联文档:

空调开启不了怎么回事空调开机不启动的原因分析 可能出现的故障原因有以下几种方面: 1、遥控器电池是否定时更换(建义用户三个月更换一次),如电池电量不足,可能导致人 机对话功能无法正常运行,空调开机...

WPS怎么开启模板第一招:从WPS首页启动模板 WPS为用户准备了各式各样的模板——报告总结、财务报表、人力资源、求职简历、文书公文、思想汇报、教学课件等等,可谓应有尽有。WPS Office 2012将...

dhcp怎么开启在一个使用TCP/IP协议的网络中,每一台计算机都必须至少有一个IP地址,才能与其他计算机连接通信。为了便于统一规划和管理网络中的IP地址,DHCP(Dynamic Host Configure Protocol...

电脑怎么开启WLANwin7直接点你右下角的小电脑或者点击扇形信号的图标即可。 一、WLAN设置不限制于台式电脑,任何连接无线路由器的电脑都可以进行WLAN的设置。 二、电脑打开任意浏览器,输入 192...

怎么开启Root权限你好,你可以使用superoneclick或者刷机精灵里面的root功能进行root,这两个软件都不是很大~ root的好处是可以删除系统内置的垃圾软件,可以禁止程序联网,自动启动等等,还可以用于...

王者荣耀防沉迷开启教学防沉迷怎么开启首先需要进来入成长守护平台(https://jiazhang.qq.com/)然后登录自己的账号。 登录孩子的账户后,在填写孩子的身份信息,就可以关联了。 防沉迷源主要功能 其中,12周岁2113以下(含1...

怎么开启蓝牙怎么说搜索不到首先看两个设备是否都具有蓝牙功能(如果是电脑还需要正确安装蓝牙驱动);其次看设备是否打开蓝牙功能(不打开的话设备不能被找到);再次还要成功连接两个设备(一般要用到PIN码和配对...

系统怎么开启远程控制系统怎么开启远程控制,远程桌面怎样启用请明细写一下步骤:方法/步骤 1 首先在Ubuntu系统中打开终端命令工具,然后输入并运行下面的命令,来安装xrdp工具,这个工具是Ubuntu设置远程...

怎么开启u盘?怎么开启u盘?高分求助。电脑如何进入U盘启动:右键点我的电脑,选择资源管理器.在资源管理器中,右键选择你要更改的驱动器,选择属性.就可以看到有"自动播放"这一项.这样就可以选择了....

推荐阅读
图文推荐