精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-06
最后修改:2012-04-08
接上节:跟我学OpenJPA之二(Hello OpenJPA) 下节传送门:跟我学OpenJPA之四(与其他JPA实现的互换与对比---实践是检验真理的唯一标准)
昨天打开ITEYE,发现我的两篇文章上了首页兴奋ing.... 上ITEYE不短时间,同时上两篇还是第一次,感谢大家的支持,谢谢!
本来昨天考虑好了第三节的题目和内容,可惜出了趟差,回来的时候又冒雨开了两个多小时的车,高速上精神太紧张回来直接倒头睡觉,今天虽然晚上时间也不多,但是有大家的支持再累也得补上。嘿嘿 废话多了些,归正传先
=================废话的分割线===================
奥林匹克五个圈圈的精神:更高、更快、更强,同样我们的OpenJPA也有这样的需求,因此有了Enhance(参见http://book.51cto.com/art/200806/76766.htm )。这个东西非常奇特,借用参考里面的解释:
------OpenJPA的增强器(Enhancer)能够在运行时对系统性能进行优化,并且提高惰性加载的灵活性,是OpenJPA与Hibernate最大不同之处。增强器能够自动为持久化的类添加一些代码,这些代码能够帮助二进制的类实现持久化类所必需的一些特性。OpenJPA的增强器可以通过两种方式对持久化类进行优化,一是编译时强化;二是使用Java 5 提供的新特性Instrumentation,在运行时创建代理来强化。
这个是OpenJPA的一大特点,很多人在刚开始接触的时候很容易因为这个出错,因为OpenJPA默认是开启了编译时强化,我最开始使用OpenJPA的时候就经历了下面的过程。
我们现在修改上次Test代码: @Test public void doTest() { System.out.println("=====Hello OpenJPA " + entityManager + "======="); TXx txx = new TXx(); txx.setXxMc("第一选项"); entityManager.persist(txx); } 运行后报错如下: ............. <openjpa-2.1.1-r422266:1148538 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: " com.strong.module.txx.jpa.TXx". ............. 解决的方法有三种:
第一,在我之前的文章写过,就是使用Spring的Instrumentation(传送门Spring3(MVC)+OpenJPA2构建及发布),这个方法的缺点就是发布的时候在Tomcat的启动配置中也需要增加-javaagent:/simen/workspace/tomcat/lib/spring-agent.jar,且效率不高。下面列出我之前文章的内容给大家参考一下,不建议大家在实际中使用:
----当初为这个把我郁闷的,去
OpenJPA和Spring网站翻了半天才知道tomcat启动的时候要注册一个agent,名字叫spring-agent.jar,兴奋……翻遍
spring的包没找到这个东东
狂晕……,求教Google半天从一个犄角旮旯发现2.5这个包换名字,现在是org.springframework.instrument-
3.0.1.RELEASE-A.jar,找到2.5的spring-agent.jar才发现本来包里面的路径名就应该是instrument。把这个包改成spring-agent.jar(本身那个太长了),放到tomcat/lib目录里面,然后给tomcat加上启动参数
-javaagent:/simen/workspace/tomcat/lib/spring-agent.jar,在Eclipse里面是右键点这个
项目,Debug as -> Debug Configrations....
。
第二,在persistence.xml中增加如下: <!-- 不使用加载时强化和编译时强化,使用运行时Unenhanced --> <property name="openjpa.ClassLoadEnhancement" value="false" /> <property name="openjpa.DynamicEnhancementAgent" value="false" /> <property name="openjpa.RuntimeUnenhancedClasses" value="supported" /> 这个方法最简单,可惜不能发挥OpenJPA的最大效能,所以也不推荐
第三,终极解决方案(参考http://www.ibm.com/developerworks/cn/java/j-lo-openjpa2/ )对每个持久化类执行 java org.apache.openjpa.enhance.PCEnhancer TXx.java 介个.......太麻烦了..............我还是不用了吧,不过等等,OpenJPA官方提供了几种解决方法,参见http://openjpa.apache.org/entity-enhancement.html ,如果使用的是Eclipse,那么还有无缝解决方案,参见http://openjpa.apache.org/enhancement-with-eclipse.html ,这里我使用的是Eclipse增加Ant编译的方法(插件无法安装,还有一些限制我直接无视了),过程如下(简单翻译官方文档,E文较差大家将就):
1、下载enhance.xml.tar.gz
解压到项目的根目录;新建openjpa_libs目录,下载与项目maven中openjpa版本相同openjpa-all
的jar包到这个目录(千万不要直接用openjpa-****.jar,必须是openjpa-all-*****.jar
),刷新项目保证能看增加的内容
2、右键项目,选择属性,进入Builders
3、新建一个Ant Builder,在Main选项卡,Buildfile的点“Browse Workspace”,选择上面的那个xml文件
Base Directory的点“Variables ”,选择build_project
最后填写Arguments的内容如图:
4、在Targets选项卡中为Manual Build 和 Auto Build点“Set Targets..”添加enhance
5、保存后控制台提示Ant Build的信息如下(不能显示的话刷新项目): Buildfile: /simen/ramwork/StrongOpenJPA/enhance.xml openjpa.libs.check: build.dir.check: enhance: [echo] /simen/ramwork/StrongOpenJPA/target/classes:/simen/ramwork/StrongOpenJPA/openjpa_libs/openjpa-all-2.2.0.jar [openjpac] 299 StrongOpenJPAPU INFO [Worker-44] openjpa.Tool - Enhancer running on type "com.strong.module.txx.jpa.TXx". BUILD SUCCESSFUL Total time: 1 second 这里提示TXx类在编译的时候被增强,再次运行Test,运行通过
本节成功的把TXx增强了起来,如果大家觉得麻烦也可以直接枪毙了这个增强,或者在开发过程中不增强只是在发布的时候增强一下,恩这个主意不错! 可能大家会发现一个问题,刚才的Test执行了,但是数据库的内容没有变化,为什么?当然是事务的问题,这个问题下节我们继续。
本节资源: OpenJPA官方提供的Eclipse增强xml:enhance.xml.tar.gz 本节的源码(内含openjpa-2.2.0.jar,上节源码在maven中没有MySQL的JDBC,本节已默认增加):StrongOpenJPA.tar.gz
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-04-08
给个建议,起个能说明你要讲的内容的标题,标题很告诉大家主要意图。
|
|
返回顶楼 | |
发表时间:2012-04-08
jinnianshilongnian 写道 给个建议,起个能说明你要讲的内容的标题,标题很告诉大家主要意图。
我是不太喜欢直白的标题,所以副标题尽量选择相近的生动的文字,后面考虑增加一些大致的内容介绍。 |
|
返回顶楼 | |
发表时间:2012-04-08
2楼建议不错,可以这样 跟我学JPAX-对象增强,这样大家一看就知道学到哪一步了,太抽象不方便,这些是细节!!!
|
|
返回顶楼 | |
浏览 8461 次