上节跟我学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
分享到:
相关推荐
**OpenJPA**(Open Java Persistence API)是Apache软件基金会的一个开源项目,它是Java持久层规范JPA(Java Persistence API)的实现,用于处理对象关系映射(ORM)。OpenJPA提供了一个框架,使得Java对象可以直接...
OpenJPA,全称Open Java Persistence API,是Java平台上的一个开源对象关系映射(ORM)框架,它实现了Java Persistence API(JPA),用于管理Java应用程序中的持久化数据。在这个"openjpademo"示例中,我们将会探讨...
使 用 OpenJPA 开发企业应用时,保持数据库和对象视图的一致性是非常重要的工作,OpenJPA 支持三种模式处理数据库和对象视图的一致性:正向映射(Forward Mapping)、反向映射(Reverse Mapping)、中间匹配(Meet...
同时,阅读源码可以帮助你更深入地理解OpenJPA的工作流程,以便更好地利用它来解决实际开发中的问题。 总之,OpenJPA源码的下载和研究对于Java开发者来说是一次宝贵的学习机会,不仅可以提升对JPA规范的理解,还...
默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,Open...
**三、Spring与OpenJPA集成** 1. **配置OpenJPA** 首先,需要在项目的pom.xml文件中添加OpenJPA和Spring的依赖。然后,在Spring的配置文件(如applicationContext.xml)中声明OpenJPA的数据源、实体管理和事务...
在Java世界里,Spring框架是应用最广泛的轻量级框架之一,它提供了强大的依赖注入、AOP(面向切面编程)以及数据访问等能力。OpenJPA(Java Persistence API)则是Java平台上的一个ORM(对象关系映射)工具,它实现...
OpenJPA2是一个开源的对象关系映射(ORM)框架,它是Java Persistence API(JPA)规范的实现。在这个“Open JPA2 employee简单例子”中,我们将深入理解如何使用OpenJPA2来处理数据库中的员工数据。这个示例将帮助...
- **文档目的**:此官方手册旨在详细介绍OpenJPA的各种特性和用法,以便帮助开发人员更好地理解和使用该框架。 - **目标读者**:面向对Java持久化感兴趣或正在使用JPA的应用程序开发人员。 #### 三、Java ...
OpenJPA API 文档 chm格式
OpenJPA,全称为Open Java Persistence API,是Apache软件基金会下的一个开源项目,主要目标是实现Java持久化规范,即JPA(Java Persistence API)。JPA是Java EE平台中的一个核心组件,它提供了一种标准的方式来...
而“工具”标签则暗示了OpenJPA作为一个开发工具,可能有相关的辅助工具或者插件,帮助开发者更便捷地进行ORM工作。 压缩包中的文件“OpenJpaTest”可能是作者提供的一个示例测试项目,包含了如何配置OpenJPA、创建...
### OpenJPA-Manual 关键知识点解析 #### 一、OpenJPA介绍 **1.1 关于本文档** ...以上是对“openjpa-manual”文档的关键知识点的总结,希望能帮助读者更好地理解JPA和OpenJPA的相关概念和技术细节。
OpenJPA还提供了一种强大的查询语言——JPQL(Java Persistence Query Language),类似于SQL,但更面向对象。JPQL可以用来执行复杂的查询,如关联查询、分组和排序,甚至可以使用动态查询构造器生成运行时的查询。 ...
Spring MVC和OpenJPA是Java开发中常用的两个框架,它们分别在Web应用和持久层处理上发挥着重要作用。Spring MVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而OpenJPA则是一个实现了Java Persistence ...
### Apache OpenJPA 2.1 用户指南:Java Persistence API 的深入解析 #### 一、简介 ...此外,该文档还提供了大量的示例代码和最佳实践建议,帮助开发人员更好地掌握和运用 OpenJPA 的各项特性。
Openjpa2.2+Mysql+Maven+Servlet+JSP 博客源码: http://blog.csdn.net/shenhonglei1234/article/details/10394379
Apache OpenJPA-自述文件 前言 感谢您下载此版本的Apache OpenJPA。 Apache OpenJPA是Java Persistence API规范的实现。 执照 此存储库的内容已根据Apache License 2.0 许可 更多信息 可以在openjpa-project子目录...
OpenJPA 是 Apache 组织提供的开源项目,它实现了 EJB 3.0 中的 JPA 标准,为开发者提供功能强大、使用简单的持久化数据管理框架。OpenJPA 封装了和关系型数据库交互的操作,让开发者把注意力集中在编写业务逻辑上。...