Java EE5到底有什么系列 – Java Persistence API 1.0( EJB3 Entity Bean)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
转自: http://blog.csdn.net/redmarketing/archive/2006/01/16/580440.aspx

Java EE5作为新一代Java企业开发平台的规范,从开始设计就引来了整个java开发社区的注目,引起无数的辩论和带来了众多的期盼。Java EE5作为J2EE平台诞生几近6年后的第4代规范重点关注的是目前java开发的几个热点:开发效率,运行效率和企业应用整合。目标也是让J2EE开发 简单,简单再简单。那我们就看看J2EE5规范到底有什么,是否真的能给开发者/企业带来真正的实惠?

Java EE5规范是一个所谓的雨伞规范(Umbrella),在其下是一系列的子规范,主要包括:
EJB 3.0 (JSR 220)
Java Persistence API 1.0 (JSR 220)
JSP 2.1 (JSR 245)
JSF 1.2 (JSR 252)
JAX-WS 2.0 (JSR 224)
StAX 1.0 (JSR 173)
JAXB 2.0 (JSR 222)
Web Services Annotations 1.0 (JSR 181)
Common Annotations 1.0 (JSR 250)
SAAJ 1.3 maintenance
JTA 1.1 maintenance
JavaMail 1.4 & JAF 1.1 maintenance
JSTL 1.2 maintenance
Java EE Mgmt maintenance
JACC maintenance
Servlet maintenance
Java EE Deployment maintenance
WSEE maintenance

Java Persistence API 1.0( EJB3 Entity Bean) 在Java EE5中, Entity Bean做为EJB规范中负责持久化的组件将逐渐成为一个历史名词了,作为J2EE 4规范中最为人所垢病的Entity Bean在Java EE5中被推到重来,取而代之的是java开发的通用持久化规范Java Persistence API 1.0, 其实就是完全重新定义了的Entity Bean规范(目前在很多场合中,由于历史原因我们仍然使用ejb3持久化来称呼这个规范)。JPA作为java中负责关系数据持久化的组件已经完全独立 出来成为一个单独的规范,而不再属于Enterprise Java Bean的范畴(EJB更多的是指Stateless/Stateful session bean和Message Driven Bean)。

Java Persistence AP(JPA)可以说是java持久化技术的一个集大成者,它吸取了Hiberante,JDO,TopLink等优秀技术和框架,将这几年发展成熟起来 的基于POJO模型的O/R Mapping技术标准化,成为在J2EE和J2SE环境中通用的java持久化API。值得注意的是Java Persistence API并不是J2EE环境专用,而是在java中的通用API。意味着我们可以在任何需要访问关系数据库的地方使用JPA,甚至包括swing开发的桌面 应用。JPA也不要求一定在J2EE容器中才能运行,而是任何有JVM的环境都可以运用。 这就使得我们可以很容易的把JPA作为一个持久化组件自由地和各种容器/框架(EJB3容器, Spring等等)组合。

JPA如何简化原来EJB2中Entity Bean的开发,看一个简单对比:

 EJB2.0EJB3.0(JPA)
Business Interface
public inerface HelloWold extends EJBLocalObject{
Public String getResult();
}
无需定义接口
映射配置文件编写EJB3 Deployment descriptor可选
EJB实现
public class HelloWorldEntityBean 
implements HelloWold, EntityBean{
private int id;
private String result;
private EntityContext txt;

public HelloWorldEntityBean(){}
public void setEntityContext( EntityContext text ){
txt = text;
}

public String getResult(){
Return result;
}

public int getId(){
return id;
}

public void setResult( String result ){
this.result = result;
}

public String cretaeByName( String name ) throws EJBException{
.....
}

}
@Entity
@Table(name=”hellotable”)
public class HelloWoldEntity{
@Id
private int id; p
private String result;

public HelloWoldEntity(){}

public String getResult(){
return result;
}

public int getId(){
return id;
}

public void setResult( String result ){
this.result = result;
}
}

在JPA 中,ejb3的Entity Bean就是一个简单的java bean,即POJO( Plain Old Java Object)。不象EJB2中的EntityBean需要跟容器有密切的关联(EJB2中必须有EntityContext),EJB3 中的entityBean和容器无关,事实上在JPA中,EntityBean也不再称为EntityBean,而是Entity,和Session Bean/Message Driven Bean的仍然存在的EJB区别开来。

为了简化O/R Mapping的配置,JPA大量采用JDK1.5的最重要的新特性annotaion直接在java代码中进行配置的标注。 采用annotation标注O/R Mapping配置可以大幅度减少以往使用xml配置O/R Mapping工作量,提高效率和可维护性。

下面是一个最简单的一对一关联关系采用annotation和xml的配置比较。

 Java Persistence API(EJB3 Persistence)Hiberante
配置文件可选需要
One-To-One配置可选
<one-to-one        
name="address"
class="com.foo.Address"
cascade="All"
lazy="false"/>
Java代码
public class Order{     
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZYL)
Address address;
......
}
public class Order{    
Address address;
......
}

采用annotation的优势在于:

  • 减少了配置文件的数量,特别是在实体(Entity)比较多的系统中,维护大量的O/R Mapping xml配置文件是不少的工作量。
  • 减少了配置需要标注的内容。由于annotation由java compiler来编译解析,很多需要在xml配置中显式声明的内容不再需要(比如变量名称,类型,集合中的对象类型等)。
  • Annotation的编译期检查可以避免xml文件中容易出现的配置语法错误,在IDE中及时发现和纠正。
  • 无需在xml配置文件和java代码中切换,较少思维的跳跃,提高了开发效率。
  • annotation被编译到java bytecode中,省略了xml的解析过程,极大的提升应用的启动速度和内存占用(特别是Entity多的情况)。

JPA在启动上做了很多程度的简化,使我们能够很容易地在容器内(container)和J2SE环境中使用JPA。JPA拥有一个最基本的工厂类 EntityManagerFactory。通过调用这个工厂类的createEntityManager()方法获得EntityManager。所有 对实体(Entity)的操作包括持久化,查询,删除等等操作都都定义EntityManager上。

public interface EntityManager {
public void persist(Object entity);
public T merge(T entity);
public void remove(Object entity);
public T find(Class entityClass, Object primaryKey);
public T getReference(Class entityClass, Object primaryKey);
public void flush();
public void setFlushMode(FlushModeType flushMode);
public FlushModeType getFlushMode();
public void lock(Object entity, LockModeType lockMode);
public void refresh(Object entity);
public void clear();
public boolean contains(Object entity);
public Query createQuery(String ejbqlString);
public Query createNamedQuery(String name);
public Query createNativeQuery(String sqlString);
public Query createNativeQuery(String sqlString, Class result-
Class);
public Query createNativeQuery(String sqlString, String result-
SetMapping);
public void close();
public boolean isOpen();
public EntityTransaction getTransaction();
}

那又如何获得EntityManagerFactory呢?不管是在J2EE或者J2SE中,都需要通过一个persistence.xml配置文件对EntityMangaerFactory进行配置。下面是一个最简单的persistence.xml的范例。

<entity-manager>
<name>myEntityManager>/name>
<provider>com.redsoft.ejb3.PersistenceProviderImpl>/provider>
<class>com.redsoft.samples.HelloEntityBean>/class>
<properties>
<property name="ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="ConnectionURL" value="jdbc:mysql://localhost/EJB3Test"/>
<property name="ConnectionUserName" value="ejb3"/>
<property name="ConnectionPassword" value="ejb3"/>
>/properties>
</entity-manager>

name – 定了当前这个EntityMangaerFactory的名字,我们可以在一个persistence.xml中定义多个EntityManagerFactory。

Provider – 定了提供EntityManagerFactory的具体实现类。这个实现类由不同的持久化产品开发商提供。例子中采用的是国产红工场的ejb3持久化实 现的 EntityManagerFactory实现类。如如果我们需要更换成其他厂商的产品,就需要更换具体的实现类。

class – 列出所有需要被JPA管理的实体类。为了保证在J2SE/J2EE中的通用性和可移植性,JPA要求这里必须列出所有被JPA管理的实体类。

properties – 由持久化厂商自行定义的属性。

如果使用JTA事务,也可以使用 <jta-data-source>myDataSource</ jta-data-source>来定义连接池。

在J2EE 容器环境中和J2SE环境中,都是通过读取这个配置文件来初始化EntityMangaerFactory。在J2EE容器环境下,ejb3容器负责读取 persistence.xml并初始化EntityManagerFactory,并将EntityManagerFactory帮定到JDNI中,这 样我们就可以通过访问JNDI获得EntityManagerFactory, 进而获得EntityManager。由于EJB3容器支持IOC模式,我们也可以通过IOC将EntityMangerFactory直接注射给需要的 使用JPA持久化的java类。通过IOC注射的方式获得EntityManagerFactory或者EntityManager是更方便,合理和推荐 的方式。

而在J2SE环境中,我们可以通过标准的javax.persistence.Persistence类来获得 EntityManagerFactory。Javax.persistence.Persistence会在当前classpath或者jar包的 META-INF/下搜索并读persistence.xml后初始化EntityManagerFactory。

下面是一个简单的示例如何在J2SE环境中获得EntityManagerFactory并获得EntityManager,运用EntityManager持久化HelloWorldEntityBean.

public class HelloWorld {

public static void main( final String[] args ){

/*
* Obtain an EJB3 entity manager
*/
final EntityManagerFactory emf = Persistence.createEntityManagerFactory();
final EntityManager entityManager = emf.createEntityManager();

// Construct a HelloEntityBean
final HelloEntityBean hello = new HelloEntityBean( 1, "foo" );
EntityTransaction trans = entityManager.getTransaction();
trans.begin();
entityManager.persist( hello );
trans.commit();
System.out.println( "Successfully persist hello: " + hello );

// Look up the HelloEntityBean by primarky key
final HelloEntityBean anotherHello = entityManager.find( HelloEntityBean.class, new Integer( hello.getId() ) );
System.out.println( "Found hello: " + anotherHello );

// close the EntityManager
entityManager.close();
emf.close();
}
}

事实上不管是在J2SE还是J2EE中我们都可以这样通过javax.persistence.Persistence来初始化EntityManagerFactory。

在 上面HelloWorld的例子中我们需要显式调用 javax.persistence.Persistence.createEntityManagerFactory, 并且显式地开始事务和关闭事务。在今天大量使用IOC托管容器的时代,这样的编码已经显得落后。

作为J2EE一个部分的JPA自然可以利用EJB3的IOC容器托管事务和注射资源,同样的也可以使用开源IOC容器spring来托管事务和注射资源。红工场也提供了一个开源的spring DAO扩展 http://sourceforge.net/projects/ejb3daosupport 是来支持JPA和Spring的结合。

下面是一个如何在Spring中托管事务和在DAO中注入EntityManager的配置范例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "file://spring-beans.dtd">

<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost/EJB3Test</value></property>
<property name="username"><value>ejb3</value></property>
<property name="password"><value>ejb3</value></property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.ejb3.LocalEntityManagerFactoryBean">
<property name="persistenceInfo"><ref local="persistenceInfo"/></property>

</bean>
<bean id="persistenceInfo" class="com.redsoft.ejb3.PersistenceInfoImpl">
<property name="nonJtaDataSource"><ref local="dataSource"/></property>
<property name="entityManagerName"><value>myEntityManager</value></property>
<property name="persistenceProviderClassName">
<value>
com.redsoft.ejb3.PersistenceProviderImpl
</value>
</property>
<property name="entityClassNames">
<list>
<value>com.redsoft.ejb3.spring.Child</value>
<value>com.redsoft.ejb3.spring.Father</value>
</list>
</property>
<property name="properties">
<props>
<prop key="javax.jdo.PersistenceManagerFactoryClass">
com.redsoft.jdo.PersistenceManagerFactoryImpl
</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.ejb3.EJB3TransactionManager"
singleton="true">
<property name="entityManagerFactory">
<ref local="entityManagerFactory" />
</property>
</bean>

<bean id="dao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
singleton="true">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<bean class="com.redsoft.ejb3.spring.DAOImpl">
<property name="entityManagerFactory">
<ref local="entityManagerFactory" />
</property>
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>

文中的例子可以从红工场主页下载 http://www.redsoftfactory.com/chinese/index.html





javax.persistence-api-2.2.jar javax.persistence-api-2.2.jar框架包,仅供大家学习使用,谢谢! 立即下载

相关推荐

最新的JAVAEE5API Struts的API

最新的JAVAEE5API Struts的API 最新的JAVAEE5API Struts的API 最新的JAVAEE5API Struts的API

了解 Java EE 5

了解 Java EE 5   

坚持,才是力量.老实做人,踏实做事. 1073

05_JavaEE回顾笔记Ⅰ

Day01MySQL入门 1.1数据库介绍 1.什么是数据库? 数据存储的仓库,本质上是一个文件系统,作用:方便管理数据的。 2.数据库管理系统 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件。 数据库管理系统--->MySQL软件-->多个仓库--->多张表--->多条记录(数据) 3.操作数据库流程 现在服务器上安装MySQL软件,再在MySQL软件中创建多个数据库,在每个数据库中创建多张表。数据是保存在

skping 1125

最新JavaEE程序员成长线图

在技术方面无论我们怎么学习,总感觉需要提升自己,却又不知道从哪里入手,同时也不知道自己处在什么水平。这时候就需要有清晰的指示图来指引我们,这样我们能清楚的知道我们在哪些方面不足,以及大概处在哪个阶段和水平。 下载地址:百度网盘   Java程序员 高级特性   反射、泛型、注释符、自动装箱拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入   核心编程   反射IO、多...

xh403247554的博客 1201

java ee5技术有哪些_了解 Java EE 5

【IT168 技术文章】引言纵观 Java Platform, Enterprise Edition (Java EE) 规范的历史可以看出,每次重大修订都是由一个重要主题推动的。例如,第一次发布 J2EE1.2 时,伴随的重要主题是首次将单独的规范绑定在一起,后来,在 J2EE 1.4 中,关注的重要主题则是 Web 服务。图 1 显示了 Java EE 的摘要历史,列出了每个版本的重要功能...

weixin_30652105的博客 640

收到了免费的Visual Studio 2005 EE

昨天,收到了Micorsoft寄来的MSDN开发精选(5),其中就包含了SQL Server 2005 Express Edition和Visual c# 2005 EE,^_^,免去了下载之苦,可惜不是全套的Visual Studio 2005 Express Editions。         原定$49 的Visual Studio 2005 Express Editions (Visual...

weixin_34341229的博客 904

Java EE实战指南》快速学习线图(2022版)

正确选择比瞎努力更重要!

西安极客联盟 5639

Sql server 2005数据库安装心得

 我的环境是xp sp2 EN,SQL 2005 Dev版,内存512MB。     首先,我的系统已经使用半年多了,装有VS2003,以前还装过SQL2000,netFramework2.0beta,还有好几个beta版的SQL 2005,可谓十分“肮脏”了,呵呵。最早的时候我下过一个2005EE版,怎么也安装不上,后来发现原来是EE不支持xp ,然后就下了DE版的。     刚开始安装的时候吓

等待明年 723

2020-09-05 好网站收藏

https://zhuanlan.zhihu.com/p/67881959 B站海贼王飞 B站海贼王飞 不知名EE 阿婆主 ​关注 电子工程师必备网站 1 年前 这是我常用的一些网站,分享给大家,不定期更新。 一.培训类 摩尔吧 https://www.moore8.com/ 大师云集的电子培训网站 TI培训 http://edu.21ic.com/ 原厂,就是给力 网易公开课 https://open.163.com/ MIT的老师,就是牛逼 学堂在线 http://www.xuetangx.com/

CSAPP 1518

EE系统标准(JAVA EE5

最近,SUN的伙伴们(the folks at SUN)将J2EE 1.5改名为java EE 5,当然以前J2EE版本还是称为J2EE,之所以改名,目的还是让大家清楚J2EE只是Java企业应用,用我的话来说,J2EE就是Java在数据库服务器端的应用(见初学者如何开发出一个高质量的J2EE系统)。  看来,现在大多数人倾向于更加突出Java了,J2EE容易让初学者误解是独立于一套Java

ifconfig的采集 1540

signature=a5d52dd3b1c2e95cc6ca952d8f8e8a05,6d53beb98227311df5d5a4ccf0177f23

http://pan.baidu.com/s/1qYziQoW密码:ehge挑了几个MIPS:ad87780995fd77011f9d6c20efce591b89e4046e66165df6b7b50f4e651e67913201e2af37ca2888e9f2e71a03ce310ed3ffb217d6a9a01dc0cac2e5a68f9e3714deb8ec0b3afe6c6e83d...

weixin_33597080的博客 26万+

python写脚本看xde文件_python文件读写

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01^\x01^\x00\x00\xff\xdb\x00C\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06\x07\x07\x06\x08\n\x10\n\n\t\t\n\x14\x0e\x0f\x0c\x10\x17\x14\x18\x18\x17\x14\x1...

weixin_39623713的博客 1万+

javaEE-05出现的错误及解决方法

使用Class 类读取资源时,浏览器无法正常显示中文 package com.yd.web.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServ...

qq_45438193的博客 397

编程软件索引2026

Java开发环境合集 magnet:?xt=urn:btih:B45D1E6B7495AC1D9CD3023ECC49A0FB6D1D14E1 常用软件 magnet:?xt=urn:btih:80487288658E331E240797B43E718986B1F24F20 数据库合集 magnet:?xt=urn:btih:997D8B4F8F326FA285F85F56E5282119E98A859E MySQL Server Mini magnet:?xt=urn:btih:C9857957207A8

博客 17万+

SQL2005疑难解决方案大全

SQL2005疑难解决方案大全 目录 目录................................................................................................................................. 1 无法连接到服务器................................

samozihu的专栏 1万+

st8200网络计算机,全球网络设备MAC地址资料汇总(四十八)

A4-EE-57 (hex) Seiko Epson CorporationA4EE57 (base 16) Seiko Epson Corporation3-3-5 OWASUWA-SHI NAGANO-KEN 392-8502JP9C-AE-D3 (hex) Seiko Epson Corporation9CAED3 (base 16) Seiko Epson Corporation80 Ha...

weixin_39789525的博客 5万+

ffmpeg源码简析(十三)ffmpeg API变更 2009-03-01—— 2017-05-09变更

Add:新增的Change/Rename:修改的Deprecate:过时的。以后很有可能删除。Remove:删除的 The last version increases were: libavcodec: 2015-08-28 libavdevice: 2015-08-28 libavfilter: 2015-08-28 libavformat: 2015-08-28 libavr

WangShuo的专栏 3万+

05JavaEE第五章Git

版本控制 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。 开发中经常对一个文件进行修改,修改后之前的记录就被覆盖了,有时又需要还原到之

m0_51996043的博客 232
上一篇: Tomcat 5.5 配置
下一篇: windows下最好的C++ IDE
flysnowing
博客等级 码龄23年 4粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值