`
zhouxianglh
  • 浏览: 267627 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(1)浅探Hibernate中延迟加载

阅读更多

好好学习了一下,Hibernate 方面的书,温故而知新,可以为师亦.

我们如果使用用延迟加载实际上用的是Hibernate 中使用的代理类.它默认依赖 cglib 来实现.

Hibernate 中使用 CGLIB 和 javassist  来完成延迟加的.

CGLIB 如下:

依懒包:cglib-2.1.3.jar

首先定义一个供调用的接口:com.isw2.hibernate.test.interfaces.ITest.java

package com.isw2.hibernate.test.interfaces;

public interface ITest {
	public void testFirst();

	public void testSecond();
}

接着要定义一个拦截器:com.isw2.hibernate.test.TestITest.java

package com.isw2.hibernate.test;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 *  MethodInterceptor 是一个拦截器接口
 * @author Administrator
 *
 */
public class TestITest implements MethodInterceptor {
	public Object intercept(Object object, Method method, Object[] objArr,
			MethodProxy methodProxy) throws Throwable {
		System.out.println("display" + method.getName());
		return null;
	}
}

 这样就可以使用了.

public static void main(String[] args) {
	//过滤器类
	MethodInterceptor methodInterceptor = new TestITest();
	Enhancer eh = new Enhancer();
	//设置接口
	eh.setSuperclass(ITest.class);
	//设置调用过滤器
	eh.setCallback(methodInterceptor);
	//创建代理类
	ITest test = (ITest) eh.create();
	test.testFirst();
	test.testSecond();
}

 

javassist执行的是字节码操作.相关如下:

依懒Jar 包:javassist.jar

首先建一个使用类com.isw2.bean.ButtBean.java

package com.isw2.bean;

public class ButtBean {
	public void disPlay() {
		System.out.println("ButtBean.disPlay");
	}
}

 javassist 的使用:

try {
	//ClassPool 是CtClass 的工厂
	//CtClass 类似于一个代理类,通过它获取代理类运行时内容
	CtClass ctclass = ClassPool.getDefault().get(
			"com.isw2.bean.ButtBean");
	String oldMethod = "disPlay";
	//CtMethod 代表 CtClass 中的方法.
	CtMethod ctMethod = ctclass.getDeclaredMethod(oldMethod);
	String newMehtod = oldMethod + "New";
	ctMethod.setName(newMehtod);
	CtMethod ctNewMethod = CtNewMethod.copy(ctMethod, oldMethod, ctclass, null);
	StringBuffer sbuffer = new StringBuffer();
	sbuffer.append("{\nSystem.out.println(\"ButtBean.disPlay "
			+ "javassist help compile\");\n}");
	ctNewMethod.setBody(sbuffer.toString());
	ctclass.addMethod(ctNewMethod);
	System.out.println("输出结果:");
	// 这里要注意的是 BuffBean 必在这之前没有补JVM 加载,否则在这里会出错
	ButtBean butt = (ButtBean) ctclass.toClass().newInstance();
	butt.disPlay();
} catch (NotFoundException e) {
	e.printStackTrace();
} catch (CannotCompileException e2) {
	e2.printStackTrace();
} catch (Exception e3) {
	e3.printStackTrace();
}
 

  相关的操作

http://blog.csdn.net/yadandan520_ya/archive/2009/03/04/3956867.aspx

http://brighter.iteye.com/blog/224629

都分别给了详细的操作说明.

 

在org.hibernate.cfg.Environment.buildBytecodeProvider 里,将 "cglib",改为 "javassist" 这样,Hibernate 就会使用 javassist 来生成代理对象了.

分享到:
评论

相关推荐

    电子商务浅探(1).ppt

    《电子商务浅探(1).ppt》是对电子商务领域的深入探讨,主要涵盖了电子商务的定义、发展历程、主要经营模式以及其深远影响。以下是对这些知识点的详细解析: 1. 电子商务概述: 电子商务,简称电商,是一种利用...

    高中历史知识结构浅探论文.doc

    高中历史知识结构浅探论文.doc

    浅探中国电子商务发展中的问题与对策-1.docx

    "浅探中国电子商务发展中的问题与对策" 本文主要探讨了中国电子商务发展中的问题和对策。首先,本文对中国电子商务发展现状进行了分析,指出电子商务是中国新兴的商业运营模式,近年来发展迅速,有着广阔的发展前景...

    Visual C++中函数调用方式浅探

    Visual C++中函数调用方式浅探 在 Visual C++ 中,函数调用方式是一个非常重要的概念。不同的函数调用方式会对程序的执行和性能产生影响。在 C 和 C++ 中,默认的函数调用方式是 C 式调用,也就是 __cdecl。除非...

    visual c++中函数调用方式浅探

    ### Visual C++中函数调用方式浅探 在Visual C++环境下进行软件开发时,了解不同的函数调用约定(calling conventions)对于优化程序性能、理解编译器行为以及避免潜在的错误至关重要。本文将深入探讨Visual C++中...

    Visual C++中函数调用方式浅探.docx

    "Visual C++中函数调用方式浅探" Visual C++中函数调用方式浅探概述: 在Visual C++中,函数调用方式可以分为两种:C式调用和Pascal式调用。其中,C式调用是缺省的,除非特殊声明。在本文中,我们将详细探讨这两种...

    互联网空中课堂的高效语文教学浅探.pdf

    1. 空中课堂定义:空中课堂是一种通过互联网实现的远程教学模式,学生和教师借助电脑、手机等终端设备,在虚拟空间中进行教学活动,打破传统课堂的时空限制。 2. 空中课堂的教学运行模式:空中课堂依赖于互联网授课...

    浅探井_csdn

    在石油、天然气或地下水的勘探中,浅探井通常用于确定地质构造、地层特性以及资源的存在和可开采性。在IT技术的应用中,这可能涵盖了数据可视化、地理信息系统(GIS)和模拟软件的使用,以帮助工程师理解和预测钻井...

    GPS在公路测量中的应用浅探.pdf

    《GPS在公路测量中的应用浅探》这篇文章主要探讨了GPS技术在公路测量中的应用及其优势。GPS(全球定位系统)自20世纪70年代起发展至今,已成为一种高精度、全天候、多功能的定位导航系统,广泛应用于大地测量和工程...

    浅探中国电子商务发展中的问题与对策.docx

    "浅探中国电子商务发展中的问题与对策" 一、电子商务发展现状 电子商务是中国新兴的商业运营模式,近年来发展迅速,有着广阔的发展前景。电子商务的发展离不开互联网的发展,由于中国互联网用户的人数众多,因而...

    微课程设计模式浅探

    微课程设计模式浅探

    浅探电力系统中配电自动化及管理 (1).pdf

    本文主要探讨了电力系统中的配电自动化及其管理。配电自动化是20世纪80年代末在发达国家兴起的技术,对于提升中国薄弱的配电网络的可靠性和效率具有重大意义。随着城网和农网的改造,变电站自动化和馈线自动化成为...

    JavaScript运行机制浅探

    ### JavaScript运行机制浅探 #### 一、引言 JavaScript是一种广泛应用于网页浏览器中的脚本语言,它在前端开发中的地位不可替代。由于其独特的运行机制,开发者常常遇到一些意料之外的行为。本文旨在深入探讨...

    Eclipse插件开发技术浅探

    ### Eclipse插件开发技术浅探 #### 一、引言 随着软件开发工具市场的多样化发展,各大软件公司如Borland、Microsoft、Oracle等推出了各自的产品。这些工具虽然丰富了软件开发领域,但也给开发人员带来了挑战,尤其...

    Delphi 的接口机制浅探

    ### Delphi 的接口机制浅探 #### 接口的引用计数管理 接口在Delphi中扮演着极其重要的角色,特别是在实现诸如OpenTools API这样的功能时。为了更好地理解Delphi中的接口机制,我们首先需要深入了解接口的引用计数...

    浅探89C55WD单片机在智能供电系统中的应用.pdf

    浅探89C55WD单片机在智能供电系统中的应用.pdf

    浅探网上银行发展.doc

    浅探网上银行发展.doc

    Delphi_的RTTI机制浅探.doc

    Delphi_的RTTI机制浅探.doc

    人工智能技术及未来发展浅探.pdf

    人工智能技术,作为21世纪最前沿的三大尖端技术之一,在过去几年中发展迅速,并在互联网、交通、医疗、制造等领域得到了广泛应用。其关键组成包括专家系统、数据挖掘与分析技术、人机交互技术,以及知识和数据的智能...

    Delphi_的消息机制浅探.doc

    Delphi_的消息机制浅探.doc

Global site tag (gtag.js) - Google Analytics