`
simen_net
  • 浏览: 307066 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

跟我学OpenJPA之三(更快、更高、更强)

 
阅读更多

上节跟我学OpenJPA之二(Hello OpenJPA)

 

昨天打开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、在Main选项卡,新建一个Ant Builder,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

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 10.3 KB
  • 大小: 54.8 KB
  • 大小: 58.1 KB
  • 大小: 28.4 KB
  • 大小: 31.4 KB
  • 大小: 68 KB
  • 大小: 14.2 KB
  • 大小: 52.3 KB
  • 大小: 27.1 KB
分享到:
评论
4 楼 string2020 2016-10-19  
spring data jpa整合openjpa报错,楼主能帮忙看看吗?
https://www.oschina.net/question/1756518_2201477

我已经把增强禁用了,为啥还是报错:has not been enhanced.
3 楼 simen_net 2014-06-03  
chinesejie 写道
我在使用simple spring memcached 缓存openjpa返回的结果的事,openjpa 总会使用org.apache.openjpa.kernel.delegatingresultlist 来存储list,这个类是不能json序列化的。而我把openjpa换成hibernate的时候就能正常使用java.util.List这个类存储list。你能解释一下吗?

simple spring memcached 没有用过,感觉也没有太大必要,OpenJPA自带的缓存基本够用,如果开发WEB的话,在MVC中采用拦截方式生成静态缓存效率更高
2 楼 chinesejie 2014-05-30  
我在使用simple spring memcached 缓存openjpa返回的结果的事,openjpa 总会使用org.apache.openjpa.kernel.delegatingresultlist 来存储list,这个类是不能json序列化的。而我把openjpa换成hibernate的时候就能正常使用java.util.List这个类存储list。你能解释一下吗?
1 楼 ft3049354 2014-03-14  
很给力!发现jpa入门的中文资料很少!!!!好文章!

相关推荐

    jsf、openJpa学习

    **OpenJPA**(Open Java Persistence API)是Apache软件基金会的一个开源项目,它是Java持久层规范JPA(Java Persistence API)的实现,用于处理对象关系映射(ORM)。OpenJPA提供了一个框架,使得Java对象可以直接...

    openjpa 写的一个例子

    OpenJPA,全称Open Java Persistence API,是Java平台上的一个开源对象关系映射(ORM)框架,它实现了Java Persistence API(JPA),用于管理Java应用程序中的持久化数据。在这个"openjpademo"示例中,我们将会探讨...

    OpenJPA 2.2.1 API (CHM格式)

     使 用 OpenJPA 开发企业应用时,保持数据库和对象视图的一致性是非常重要的工作,OpenJPA 支持三种模式处理数据库和对象视图的一致性:正向映射(Forward Mapping)、反向映射(Reverse Mapping)、中间匹配(Meet...

    openjpa 源码 下载 帮助开发人员调试

    同时,阅读源码可以帮助你更深入地理解OpenJPA的工作流程,以便更好地利用它来解决实际开发中的问题。 总之,OpenJPA源码的下载和研究对于Java开发者来说是一次宝贵的学习机会,不仅可以提升对JPA规范的理解,还...

    openjpa范例及实例工程

    默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,Open...

    Spring和openJPA集成

    **三、Spring与OpenJPA集成** 1. **配置OpenJPA** 首先,需要在项目的pom.xml文件中添加OpenJPA和Spring的依赖。然后,在Spring的配置文件(如applicationContext.xml)中声明OpenJPA的数据源、实体管理和事务...

    Spring中使用OpenJPA

    在Java世界里,Spring框架是应用最广泛的轻量级框架之一,它提供了强大的依赖注入、AOP(面向切面编程)以及数据访问等能力。OpenJPA(Java Persistence API)则是Java平台上的一个ORM(对象关系映射)工具,它实现...

    Open JPA2 employee 简单例子

    OpenJPA2是一个开源的对象关系映射(ORM)框架,它是Java Persistence API(JPA)规范的实现。在这个“Open JPA2 employee简单例子”中,我们将深入理解如何使用OpenJPA2来处理数据库中的员工数据。这个示例将帮助...

    openJPA官方手册

    - **文档目的**:此官方手册旨在详细介绍OpenJPA的各种特性和用法,以便帮助开发人员更好地理解和使用该框架。 - **目标读者**:面向对Java持久化感兴趣或正在使用JPA的应用程序开发人员。 #### 三、Java ...

    OpenJPA API 文档 chm格式

    OpenJPA API 文档 chm格式

    openjpa jar

    OpenJPA,全称为Open Java Persistence API,是Apache软件基金会下的一个开源项目,主要目标是实现Java持久化规范,即JPA(Java Persistence API)。JPA是Java EE平台中的一个核心组件,它提供了一种标准的方式来...

    openJpa的应用,感觉还可以

    而“工具”标签则暗示了OpenJPA作为一个开发工具,可能有相关的辅助工具或者插件,帮助开发者更便捷地进行ORM工作。 压缩包中的文件“OpenJpaTest”可能是作者提供的一个示例测试项目,包含了如何配置OpenJPA、创建...

    openjpa-manual

    ### OpenJPA-Manual 关键知识点解析 #### 一、OpenJPA介绍 **1.1 关于本文档** ...以上是对“openjpa-manual”文档的关键知识点的总结,希望能帮助读者更好地理解JPA和OpenJPA的相关概念和技术细节。

    通过 WebSphere Application Server V6.1 利用 OpenJPA

    OpenJPA还提供了一种强大的查询语言——JPQL(Java Persistence Query Language),类似于SQL,但更面向对象。JPQL可以用来执行复杂的查询,如关联查询、分组和排序,甚至可以使用动态查询构造器生成运行时的查询。 ...

    Spring MVC+OpenJPA框架

    Spring MVC和OpenJPA是Java开发中常用的两个框架,它们分别在Web应用和持久层处理上发挥着重要作用。Spring MVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而OpenJPA则是一个实现了Java Persistence ...

    Apache OpenJPA 2.1 User's Guide

    ### Apache OpenJPA 2.1 用户指南:Java Persistence API 的深入解析 #### 一、简介 ...此外,该文档还提供了大量的示例代码和最佳实践建议,帮助开发人员更好地掌握和运用 OpenJPA 的各项特性。

    Openjpa2.2+Mysql+Maven+Servlet+JSP source code

    Openjpa2.2+Mysql+Maven+Servlet+JSP 博客源码: http://blog.csdn.net/shenhonglei1234/article/details/10394379

    openjpa:Apache OpenJPA

    Apache OpenJPA-自述文件 前言 感谢您下载此版本的Apache OpenJPA。 Apache OpenJPA是Java Persistence API规范的实现。 执照 此存储库的内容已根据Apache License 2.0 许可 更多信息 可以在openjpa-project子目录...

    apache-openjpa-2.2.1-source

    OpenJPA 是 Apache 组织提供的开源项目,它实现了 EJB 3.0 中的 JPA 标准,为开发者提供功能强大、使用简单的持久化数据管理框架。OpenJPA 封装了和关系型数据库交互的操作,让开发者把注意力集中在编写业务逻辑上。...

Global site tag (gtag.js) - Google Analytics