OpenJPA编译期字节码增强(1)-使用OpenJPAEclipseTool实现字节码增强

在使用openjpa 的时候和使用hibernate不一样.因为hibernate是使用cglib在运行是动态修改字节码来对entity进行增强的。
而openjpa则不一样.它是在编译时字节码增强的.
编译时字节码增强的有很多种实现方式,例如 jvm代理,使用第三方类加载器..等等..
========================================================
是用OpenJPAEclipseTool是基于IDE eclipse之上.
OpenJPAEclipseTool是eclipse的一个插件...
使用OpenJPAEclipseTool编译增强字节码很简单,只需简单的几个步骤..........
首先:安装插件

     http://people.apache.org/~dwoods/openjpa/devtools/updatesite/

 
然后 :选择你的java项目右键

然后选择 Add/Remove Bytecode Enhancer,之后会弹出一些列选项:

可能插件有个bug.我的电脑上显示不完整.不过选项信息通过字面值就能理解...一般我直接默认编译了..
编译之后 : 项目ioc会改变

当然,也可以取消编译增强功能.还是选择 Add/Remove Bytecode Enhancer

注意:开启Bytecode Enhancer功能后,OpenJPAEclipseTool是实时监控编译了的.
意思就是.当开启Bytecode Enhancer后,在项目中添加了新的entity后,OpenJPAEclipseTool会自动进行编译增强.
我猜测OpenJPAEclipseTool的原理是为项目单独提供了一个classloader
OpenJPAEclipseTool的局限性:
OpenJPAEclipseTool会忽略掉persistence.xml它只编译标注有
@Entity, @MappedSuperclass, @Embeddable, @ManagedInterface 的实体
故障排查
1.为了保证项目是在编译时增强而不是在运行时增强,需要在persistence.xml中设置一个属性
openjpa.RuntimeUnenhancedClasses=unsupported
例如:
 <persistence-unit name="oracle.crm" transaction-type="RESOURCE_LOCAL">
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
 </persistence-unit>  
2.如果eclipse出现异常:
java.lang.OutOfMemoryError: Java heap space
或者
java.lang.OutOfMemoryError: PermGen space
根据字面值就能理解意思..我们需要向eclipse.ini总增加:
-XX:PermSize=64m -XX:MaxPermSize=256m -Xms128m -Xmx512m
 
 
 
参考文档:
How to install the OpenJPA Eclipse Tooling : http://openjpa.apache.org/openjpaeclipseinstallation.html
How to use the OpenJPA Eclipse Tooling Builder for Bytecode Enhancement : http://openjpa.apache.org/openjpaeclipseenhancementbuilder.html
How to develop on and build the OpenJPA Eclipse Tooling : http://openjpa.apache.org/openjpaeclipsetoolingdevandbuild.html
 
 
 
 
 
posted @ 2012-03-09 11:30  liheping  Views(1760)  Comments(0Edit  收藏  举报