﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-随变混混</title><link>http://www.blogjava.net/hhlai1990/</link><description>美丽是一门技艺</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:03:40 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:03:40 GMT</pubDate><ttl>60</ttl><item><title>用aop解决flex，hibernate延迟加载问题</title><link>http://www.blogjava.net/hhlai1990/archive/2010/10/05/333760.html</link><dc:creator>随变混混</dc:creator><author>随变混混</author><pubDate>Tue, 05 Oct 2010 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/hhlai1990/archive/2010/10/05/333760.html</guid><wfw:comment>http://www.blogjava.net/hhlai1990/comments/333760.html</wfw:comment><comments>http://www.blogjava.net/hhlai1990/archive/2010/10/05/333760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhlai1990/comments/commentRss/333760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhlai1990/services/trackbacks/333760.html</trackback:ping><description><![CDATA[<p></p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dc2e50d1-4853-4a67-93e5-adfe93b184a1" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/flex" rel="tag">flex</a>,<a href="http://technorati.com/tags/java" rel="tag">java</a>,<a href="http://technorati.com/tags/lazyload" rel="tag">lazyload</a>,<a href="http://technorati.com/tags/hibernate" rel="tag">hibernate</a></div> <p></p> <p>有很多同学在用使用flex+hibernate做应用开发时都会出现由延迟加载导致的异常:Could not initialize proxy…………….</p> <p>笔者在使用ibatis2.x做持久层时，也遇到这个问题，究其原因，在于blazeds无法正常序列化Java端返回的代理类。</p> <p>而hibernate默认会对类属性和集合属性返回代理，在大多数情况下这都是很合理的，即使要在web端访问代理属性，也可以采用openSessionInView模式，将session延伸到web层。但是flex的客户端比较特殊，不宜采取这种做法。针对这个问题，有一些开源的解决方案：dpHibernate,Glead等，但笔者感觉这些框架侵入性太强，不宜采用。</p> <p>在不引入第三方框架的情况下，可以采取两个办法：1.增加一层Vo类，将类属性和集合属性的代理进行转化，然后与as映射，传给flex端 ，这样序列化是ok的。</p> <p>2.采用Spring 的aop解决方案,对可能返回无法正常序列化的pojo方法进行拦截。步骤如下：</p> <p>1.开启@AspectJ</p> <div><pre>&lt;aop:aspectj-autoproxy/&gt;</pre></div>
<p><br>2.编写针对具有代理属性类的转化工具类：假如Student类具有多对一的类属性Grade:</p>
<div><pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Student {
	<span style="color: #0000ff">private</span> Long id;
	<span style="color: #0000ff">private</span> Grade grade;
	<span style="color: #0000ff">public</span> Long getId() {
		<span style="color: #0000ff">return</span> id;
	}
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setId(Long id) {
		<span style="color: #0000ff">this</span>.id = id;
	}
	<span style="color: #0000ff">public</span> Grade getGrade() {
		<span style="color: #0000ff">return</span> grade;
	}
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setGrade(Grade grade) {
		<span style="color: #0000ff">this</span>.grade = grade;
	}
}
</pre></div>
<p>&nbsp;</p>
<p>用代码生成器生成StudentConvert.java ：</p>
<div><pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> StudentConverter {

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> Student convert2Student(Object sourceObj) {
    	Student source=(Student) sourceObj;
        Student target = <span style="color: #0000ff">new</span> Student(); 
        target.setId(source.getId());
      <span style="color: #008000">//Hibernate.initialize(source.getGrade());  可以选择将类或集合代理初始化</span>
       <span style="color: #008000">//target.setGrade(source.getGrade());</span>
        <span style="color: #0000ff">return</span> target;
    }

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> List  convert2StudentList(List oldlist) {
        List newlist= <span style="color: #0000ff">new</span> ArrayList();
        <span style="color: #0000ff">for</span>(Object sourceObj : oldlist) {
        	newlist.add(convert2Student(sourceObj));
        }
        <span style="color: #0000ff">return</span> newlist;
    }
}</pre><pre>3.编写aop的advisor进行环绕通知,假设StudentDao 有两个方法 </pre><pre>Student findById(Long id)</pre><pre>List  findAll();</pre><pre>由代码生成器生成对应的advisor如下 HibernateAdvisor.java :</pre><pre>&nbsp;</pre>
<div><pre>@Aspect
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> HibernateAdvisor {

		<span style="color: #008000">//insert aop code  for hibernate</span>
   
<span style="color: #008000">///////////////////////////</span>
<span style="color: #008000">// Student readme</span>
<span style="color: #008000">///////////////////////////</span>
	<span style="color: #008000">/**
	 * 必须为final String类型的,注解里要使用的变量只能是静态常量类型的
	 */</span>
	<span style="color: #008000">// 切入点定义</span>
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">final</span> String StudentList = "<span style="color: #8b0000">execution(* com.lai.flex.service.StudentDao.findAll(..))</span>";
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">final</span> String Student = "<span style="color: #8b0000">execution(* com.lai.flex.service.StudentDao.findBy*(..))</span>";

	@Around(StudentList)
	<span style="color: #0000ff">public</span> List convertStudentList(ProceedingJoinPoint joinPoint) {

		//System.out.println("<span style="color: #8b0000">Convert之前</span>");
		Object[] args = joinPoint.getArgs();
		Object obj = <span style="color: #0000ff">null</span>;
		List newlist= <span style="color: #0000ff">null</span>;
		<span style="color: #0000ff">try</span> {
			obj = joinPoint.proceed(args);
			List old= (List) obj;
			newlist=(StudentConverter.convert2StudentList(oldlist));
		} <span style="color: #0000ff">catch</span> (Throwable e) {
			e.printStackTrace();
		}
		//System.out.println("<span style="color: #8b0000">Convert之后</span>"); <span style="color: #008000">// 方法执行后的代理处理</span>
		<span style="color: #0000ff">return</span> newlist;
	}

	@Around(Student)
	<span style="color: #0000ff">public</span> Student convertStudent(ProceedingJoinPoint joinPoint) {

		//System.out.println("<span style="color: #8b0000">Convert之前</span>");
		Object[] args = joinPoint.getArgs();
		Object obj = <span style="color: #0000ff">null</span>;

		Student newsStudent = <span style="color: #0000ff">null</span>;
		<span style="color: #0000ff">try</span> {
			obj = joinPoint.proceed(args);
			newsStudent = StudentConverter.convert2Student(obj);

		} <span style="color: #0000ff">catch</span> (Throwable e) {
			e.printStackTrace();
		}
		//System.out.println("<span style="color: #8b0000">Convert之后</span>"); <span style="color: #008000">// 方法执行后的代理处理</span>
		<span style="color: #0000ff">return</span> newsStudent;
	}
	
	<span style="color: #008000">// generator-insert-location</span>
  
	

}</pre></div><br><pre>最后,由StudentDao方法返回的代理类和集合属性在序列化到flex端之前，都被拦截，进行转化后，可以正常序列化了。</pre><pre>声明：如需转载，请注明作者-<a href="mailto:-hhlai1990@gmail.com">hhlai1990@gmail.com</a>  </pre><pre>欢迎大家使用rapid-framework快速开发框架以及rapid-generator代码生成器</pre><pre><a title="http://code.google.com/p/rapid-framework" href="http://code.google.com/p/rapid-framework">http://code.google.com/p/rapid-framework</a></pre><font face="Courier New"></font></div><img src ="http://www.blogjava.net/hhlai1990/aggbug/333760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhlai1990/" target="_blank">随变混混</a> 2010-10-05 10:43 <a href="http://www.blogjava.net/hhlai1990/archive/2010/10/05/333760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人博客声明</title><link>http://www.blogjava.net/hhlai1990/archive/2010/09/26/332907.html</link><dc:creator>随变混混</dc:creator><author>随变混混</author><pubDate>Sun, 26 Sep 2010 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/hhlai1990/archive/2010/09/26/332907.html</guid><wfw:comment>http://www.blogjava.net/hhlai1990/comments/332907.html</wfw:comment><comments>http://www.blogjava.net/hhlai1990/archive/2010/09/26/332907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hhlai1990/comments/commentRss/332907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hhlai1990/services/trackbacks/332907.html</trackback:ping><description><![CDATA[<p><font size="4">此博客文章绝对原创，如需转载请标明作者及来源。</font></p> <p><font size="4">作</font><font size="4">者</font></p> <p><font size="4">ID:随变混混</font></p> <p><font size="4">email:&nbsp; </font><a href="mailto:hhlai1990@gmail.com"><font size="4">hhlai1990@gmail.com</font></a></p><img src ="http://www.blogjava.net/hhlai1990/aggbug/332907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hhlai1990/" target="_blank">随变混混</a> 2010-09-26 10:17 <a href="http://www.blogjava.net/hhlai1990/archive/2010/09/26/332907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>