`

EJB3.0 EntityManager

    博客分类:
  • EJB
 
阅读更多

基本概念

EntityManager称为实体管理器,它由EntityManagerFactory所创建。EntityManagerFactory,作为EntityManager的工厂,包含有当前O-R映射的元数据信息,每个EntityManagerFactory,可称为一个持久化单元(PersistenceUnit),每个持久化单元可认为是一个数据源的映射(所谓数据源,可理解为一个数据库,我们可以在应用服务器中配置多个数据源,同时使用不同的PersistenceUnit来映射这些数据源,从而能够很方便的实现跨越多个数据库之间的事务操作!)

 

       PersistenceContext,称为持久化上下文,它一般包含有当前事务范围内的,被管理?氖堤宥韵?(Entity)的数据。每个EntityManager,都会跟一个PersistenceContext相关联。PersistenceContext中存储的是实体对象的数据,而关系数据库中存储的是记录,EntityManager正是维护这种OR映射的中间者,它可以把数据从数据库中加载到PersistenceContext中,也可以把数据从PersistenceContext中持久化到数据库,EntityManager通过Persistmergeremoverefreshflush等操作来操纵PersistenceContext与数据库数据之间的同步!

       EntityManager是应用程序操纵持久化数据的接口。它的作用与hibernate session类似。为了能够在一个请求周期中使用同一个session对象,在hibernate的解决方案中,提出了currentSession的概念,hibernate中的current session,可以跟JTA事务绑定,也可以跟当前线程绑定。在hibernate中,session管理着所有的持久化对象的数据。而在EJB3中,EntityManager管理着PersistenceContextPersistenceContext正是被管理的持久化对象的集合。

       Java EE环境下,一个JTA事务通常会横跨多个组件的调用(比如多个EJB组件的方法调用)。这些组件需要能够在单个事务范围内访问到同样的Persistence Context。为了满足这种情况的需要,当EntityManager被注入或通过jndi被查询的时候,它的Persistence Context将会在当前事务范围内自动传播,引用到同一个Persistence unitEntityManager将使用同样的Persistence Context。这可以避免在不同的组件之间传递EntityManager引用。

 

通过容器来传递PersistenceContext,而不是应用程序自己来传递EntityManager。这种方式(由容器管理着PersistenceContext,并负责传递到不同的EntityManager)称为容器管理的实体管理器(Container-Managed EntityManager),它的生命周期由容器负责管理。

 

有一种不常见的情况是,应用程序自身需要独立访问Persistence Context。即每次创建一个EntityManager都会迫使创建一个新的Persistence Context。这些Persistence Context即使在同一个事务范围内也不会跟其它EntityManager共享!这个创建过程可以由EntityManagerFactorycreateEntityManager方法来创建。这被称为应用管理的实体管理器(application-managed entity manager)。

底层事务控制

EntityManager的底层可以使用JTARESOURCE_LOCAL类型的事务控制策略。JTA一般在容器环境中使用,而RESOURCE_LOCAL一般在J2SE的环境下使用。

比如,在J2SE的环境下,由应用程序自身来创建EntityManagerFactory,并由EntityManagerFactory创建EntityManager,通过EntityManager.getTransaction.begin()方法来开启事务,commit()方法提交事务等等,这种方式就是RESOURCE_LOCAL的基本使用方法。

最常用的就是在容器环境下使用。也就是使用JTA类型的EntityManager,这样,EntityManager的调用都是在一个外部的JTA事务环境下进行的。

Container-Managed EntityManager必须是JTA类型的EntityManager,而Application-Managed EntityManager则既可以是JTA类型的EntityManager,也可以是RESOURCE_LOCAL类型的EntityManager

配置示例:

<persistence-unit name="test" transaction-type="JTA">

Container-Managed Persistence Context

    @PersistenceContext(unitName="test")

    private EntityManager em;

persistence context的生命周期对应用程序来说,总是被自动、透明的管理着的。也就是对应用程序本身来说,它对persitence context的创建、销毁一无所知,完全自动和透明。Persistence context随着JTA事务而传播。

 

一个容器管理的persistence context (即container-managed persistence context)可以被限定为单个事务范围,或,扩展其生存期跨越多个事务!这取决于当它的entity manager被创建的时候所定义的PersistenceContextType类型。它可以取值为TRANSACTIONEXTENDED。可称为:事务范围的persistence context或扩展的persistence context

 

Persistence context总是会关联到一个entity manager factory

 

-          Transaction-scope persistence context

entity manager的方法被调用的时候,如果在当前JTA事务中还没有persistence context,那么将启动一个新的persistence context ,并将它跟当前的JTA事务关联。

-          Extended persistence context

扩展的persistence context 总是跟stateful session bean绑定在一起。当在stateful session bean中注入entity manager,并定义为extended persistence context时,从我们开始调用stateful session bean开始,直到stateful session bean被销毁(移除)!通常,这可以通过调用一个在stateful session bean中被注解定义为@Remove的方法来结束一个stateful session bean的生命周期。

 

Application-Managed Persistence Context

即当我们自己创建EntityManager的时候,我们通过entityManager.close() / isOpen()方法来管理entityManager及其对应的persistence context.

 

实体对象的生命周期

几种类型:New,managed,detached,removed

 

New – 即未有id值,尚未跟persistence context建立关联的对象

Managed – id值,已跟persistence context建立了关联

Detached – id值,但没有(或不再)跟persistence context建立关联

Removed – id值,而且跟persistence context尚有关联,但已准备好要从数据库中把它删除。

 

EntityManager的接口方法

 

添加:调用persist方法

* 将把一个对象持久化,如果对象的ID非空,则在调用persist方法时将抛出异常,无法持久化

 

删除:remove方法

不能直接new一个对象,然后给它的id赋值,然后删除。要删除一个对象,这个对象必须是处于持久化状态。

 

更新:merge方法

 

Find – 查找某个对象,如果查不到该对象,将返回null,相当于get

 

getReference – 查找某个对象,如果查找不到该对象,将抛出异常,相当于load

 

flush – 将实体对象由persistence context同步到底层的数据库

l       FlushMode

n         Auto – 即在同一个事务中,在查询发生前,将自动把数据从PersistenceContext持久化到数据库中。

n         Commit – 只在提交的时候,把数据从PersistenceContext中持久化到数据库中。如果设置FlushModecommit,那么在同一个事务中,在查询之前,如果有更新的数据,这些数据是否会影响到查询的结果,这种情况,EJB3未作说明。

 

Lock – 锁定某个实体对象

实际上就是定义事务的隔离级别。总共有两种形式:READWRITE,表示:

不管是READ还是WRITE,都应该能够避免脏读(读到另外一个事务未提交的数据)和不可重复读同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

而对于WRITE来说,还应该能够强迫版本号的增加(对那些标识了版本的对象而言)。因此,其它事务无法对其做任何更改操作!

 

Refresh – 将数据从数据库中加载到Persistenc Context

 

Clear – 清除Persistence Context中缓存的实体对象数据

 

Contains – 测试当前Persistence Context中是否包含某实体对象

 

 

分享到:
评论

相关推荐

    EJB3.0和Spring比较

    例如,EJB3.0的EntityManager使用注解简化了持久化操作,同时自动处理事务管理,提升了性能和开发者效率。 3. **灵活性在服务组装(Flexibility in Service Assembly)** - EJB3.0通过注解提供了一种声明式的方式...

    EJB3.0规范和API文档

    **EJB 3.0规范和API文档** Enterprise JavaBeans(EJB)是Java平台企业版(Java EE)的核心组成部分,用于构建可扩展、安全且事务处理能力强大的分布式应用程序。EJB 3.0是EJB规范的一个重大更新,极大地简化了开发...

    EJB3.0完整代码例子

    EJB3.0是EJB规范的一个重要版本,它在EJB2.x的基础上进行了重大改进,引入了许多简化开发的新特性,使得Java企业级开发变得更加易用和高效。 EJB3.0的核心特点包括: 1. **注解驱动(Annotation-based)**:在EJB...

    Ejb3.0帮助文档包(开发手册&实例教程)

    《EJB3.0持久化开发手册》将详细讲解JPA的使用,包括实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)以及如何处理持久化操作,如保存(persist)、删除(remove)、查询(find)等。...

    EJB3.0 帮助文档

    **企业级JavaBeans(EJB)3.0详解** 企业级JavaBeans(EJB)是Java平台上用于构建可部署在企业级服务器上的分布式应用程序的一种组件模型。EJB 3.0是EJB规范的一个重大革新,它极大地简化了开发过程,并引入了许多...

    Entity-EJB3.0.rar_EJB3.0

    在这个"Entity-EJB3.0.rar"压缩包中,我们很可能找到了关于EJB 3.0实体Bean(Entity Beans)的示例代码和相关文档。 EJB 3.0引入了以下几个关键特性: 1. **注解驱动**:在EJB 3.0中,开发者可以使用Java注解...

    《EJB3.0入门经典教程精简版》源码

    本教程源码是针对EJB3.0入门的经典教程精简版,旨在帮助初学者快速掌握EJB3.0的核心概念和技术。 在EJB3.0中,有几个关键知识点: 1. **实体Bean(Entity Beans)**:EJB3.0引入了注解驱动的实体Bean,通过`@...

    EJB 3.0 持久性 API

    在EJB 3.0版本中,持久性API的引入极大地简化了对象关系映射(ORM),使得开发者可以更加专注于业务逻辑,而无需过多地关注数据库交互的细节。以下是关于EJB 3.0持久性API的详细知识点: 1. **注解驱动的持久化**:...

    JSF1.2+EJB3.0实现的一个项目实例.zip

    **JSF 1.2 和 EJB 3.0 技术详解** JavaServer Faces (JSF) 是一种用于构建用户界面的 Java EE 标准框架,它专注于简化 web 应用程序的开发。JSF 1.2 版本是在 2006 年发布,是 JSF 的一个里程碑版本,它引入了许多...

    EJB3.0

    - **实体管理器**: `EntityManager`是EJB 3.0中用于管理持久化实体的主要API。 - **查询方法**: 如何使用`find()`、`persist()`、`merge()`、`remove()`和`createQuery()`等方法。 - **关系映射**: - **一对多与多...

    EJB3.0入门教程

    **EJB3.0入门教程** 企业级JavaBean(Enterprise JavaBeans,EJB)是Java平台上用于构建可扩展、安全且事务处理能力强大的企业级应用的框架。EJB3.0是EJB技术的一个重大革新,它极大地简化了开发过程,降低了对...

    ejb3.0中英文规范

    **ejb3.0中英文规范** Enterprise JavaBeans (EJB) 3.0是Java平台上企业级应用程序开发的重要组成部分,它提供了服务器端组件模型,用于构建可扩展、安全且可移植的分布式业务应用程序。EJB 3.0规范旨在简化开发...

    EJB3.0中文文档

    ### EJB3.0中文文档知识点总结 #### 第一章:EJB知识与运行环境配置 **1.1 什么是ENTERPRISE JAVA BEANS (EJB)** EJB(Enterprise JavaBeans)是一种Java标准,用于构建分布式、健壮的企业级应用程序。它允许...

    EJB3.0规范.rar

    EJB 3.0的持久化规范还包括实体管理器(EntityManager)和实体(Entity)的概念,以及事务管理和查询语言JPQL(Java Persistence Query Language)。 **2. EJB 3.0核心规范** EJB 3.0的核心规范包含了会话bean...

    EJB3.0 的两本书

    **企业级JavaBeans(EJB)3.0详解** 企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且易于管理的企业级应用程序的核心技术。EJB 3.0是EJB规范的一个重大革新,它极大地简化了开发过程,降低了对开发者的...

    EJB 3.0 in Action

    ### EJB 3.0 in Action — 关键知识点解析 #### 一、EJB 3.0概述 - **EJB 3.0**(Enterprise JavaBeans)是Java企业级应用开发的重要组成部分,旨在简化复杂的企业级应用开发过程。EJB 3.0相比之前的版本在简化开发...

    JBOSS7+EJB3.0

    【JBOSS7+EJB3.0】是一个关于企业级Java应用服务器JBOSS7与企业JavaBeans(EJB)3.0版本结合使用的实践案例。JBOSS AS(Application Server)是Red Hat公司开发的一款开源Java EE应用服务器,而EJB 3.0是Java平台上...

Global site tag (gtag.js) - Google Analytics