`

JPA entityManager的管理

阅读更多

根据EntityManager 对象的管理方式,可以有以下两种类型。

— 容器托管的(container-managedEntityManager 对象

容器托管的EntityManager 对象最简单,程序员不需要考虑EntityManager 连接的释放,以及事务等复杂的问题,所有这些都交给容器去管理。容器托管的EntityManager 对象必须在EJB容器中运行,而不能在Web容器和J2SE的环境中运行。本书前面讲述的EntityManager 对象都是通过注入 @PersistenceContext注释来获得的,其实,这种获得EntityManager 对象的方式就是容器托管的。

— 应用托管的(application-managed)EntityManager 对象

应用托管的EntityManager 对象,程序员需要手动地控制它的释放和连接、手动地控制事务等。但这种获得应用托管的EntityManager 对象的方式,不仅可以在EJB容器中应用,也可以使 JPA 脱离EJB容器,而与任何的Java环境集成,比如说Web容器、J2SE环境等。所以从某种角度上来说,这种方式是JPA 能够独立于EJB环境运行的基础。

理想状态下,最好是选用容器托管的EntityManager 对象的方式,但在特殊的环境下,还是需要使用应用托管的EntityManager 对象这种方式。

 

应用程序管理的EntityManagerApplication-Managed EntityManager

Ø JavaSEJavaEE 环境下创建应用程序管理的EntityManager 的不同之处,并非创建EntityManager 的方式不同,而是获得创建EntityManagerEntityManagerFactory 的方式不同。
ü JavaSE 环境:Persistence.createEntityManagerFactory(“APU”).createEntityManager();
ü JavaEE 环境:使用@PersistenceUnit(unitName=”APU”) 标注EntityManagerFactory 属性。然后通过调用emf.createEntityManager() 获得EntityManager 。由于EntityManager 是开发者显式创建并管理的,因此需要在用完之后调用em.close() 方法将之关闭。EntityManagerFactory 是容器注入的,不需要也不应该调用emf.close() 方法。
Ø JavaSE 环境下,Persistence 类有两个重载的createEntityManagerFactory() 方法:
ü 有一个参数:该参数表示PersistenceUnit 的名字,然后使用persistence.xml 中的属性创建一个EntityManagerFactory
ü 有两个参数:第一个参数的作用同上,第二个参数可以让开发者设置额外的一些属性,可以作为persistence.xml 中属性的扩充,如果属性的键与persistence.xml 中相同,则代码中的设置覆盖persistence.xml 中的配置值。

Ø 就持久化上下文而言,应用程序管理的EntityManager 就像扩展的容器管理的EntityManager 。当创建应用程序管理的EntityManager 实例之后,该EntityManager 实例立即创建一个属于它自己私有的持久化上下文,该持久化上下文将一直存活下去,直到所属的EntityManager 实例销毁才消失。

 

如果使用spring3框架,那么就可以使用spring提供的容器托管方式+spring annotation transaction,使用上非常简单。但是在GAE环境下,就会造成启动时间过长。如果程序访问不频繁的话,单次访问时间很长。

 

GAE提供了应用程序管理的模式。这里需要考虑的是entityManager的创建和传递问题。

如果我们用dao class来管理具体的原子操作, 用service类来调用dao,service类来管理transaction,entityManager可以有如下的创建方式:

1。如果service, dao都是每次重新创建的,那么可以通过filter从外部创建entityManager,然后传递到service, dao当中。

2。如果希望service是单例,那么就要考虑service的线程安全性。一种方法是每个service方法创建entityManager,创建transaction, 新建dao并传递entityManager; 另一种方法就是通过threadLocal变量与单例的dao进行变量传递。

 

see more on http://open-open2009.iteye.com/blog/530843

分享到:
评论
1 楼 jayyunfei 2012-03-21  
还是不很明白

相关推荐

    jpa--7.api(EntityManager其他方法)

    jpa--7.api(EntityManager其他方法)jpa--7.api(EntityManager其他方法)jpa--7.api(EntityManager其他方法)jpa--7.api(EntityManager其他方法)

    JPA图书管理(连接数据库)

    2. **实体管理器(EntityManager)**: 这是JPA的核心组件,负责与数据存储进行交互。开发者通过`EntityManager`实例进行CRUD(创建、读取、更新、删除)操作。 3. **实体管理工厂(EntityManagerFactory)**: 创建`...

    jpa例子jpajpa

    5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行管理的。你可以使用`begin()`, `commit()`和`rollback()`方法来控制事务的边界。 6. **懒加载(Lazy Loading)与即时加载(Eager Loading...

    基于SpringBoot+JPA的信息管理系统

    JPA通过提供EntityManager接口和Entity类的注解,简化了数据库操作。 【SpringBoot集成JPA】 在SpringBoot项目中,集成JPA非常简单。只需要在pom.xml或build.gradle文件中添加相应的依赖,SpringBoot会自动配置JPA...

    基于JPA的图书管理系统

    JPA的核心概念包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)以及查询语言(JPQL)。 - **实体(Entity)**:代表数据库表的类,通常使用`@Entity`注解标记,类中的属性...

    JPA(hibernate) Dao 和 DaoSupport

    JPA是Java平台上的一个标准,它定义了如何在Java应用中管理关系数据库。它提供了一种面向对象的方式来操作数据库,通过ORM(对象关系映射)技术将Java对象与数据库表进行映射。Hibernate是一个流行的JPA实现,它扩展...

    springboot整合mybatis整合jpa使用entityManger

    使用EntityManager是JPA中的核心组件,它提供了一组方法来管理持久化实体。例如,你可以使用`entityManager.persist()`来保存新实体,`entityManager.find()`来查找实体,`entityManager.merge()`来更新实体,以及`...

    JPA源文件/jpa学习

    **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...

    JPA教程JPA教程JPA教程

    Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它提供了一种面向对象的方式来处理数据库操作,使得开发人员可以使用Java类和对象来操作数据库记录,而无需直接编写SQL语句。JPA...

    jpa--6.api(EntityManager实体的状态)

    jpa--6.api(EntityManager实体的状态)jpa--6.api(EntityManager实体的状态)jpa--6.api(EntityManager实体的状态)jpa--6.api(EntityManager实体的状态)

    JPA (一)

    2. **实体管理器(EntityManager)** - 它是 JPA 的核心组件,负责与数据库交互。它创建、更新、删除实体以及执行查询。 3. **实体管理器工厂(EntityManagerFactory)** - 是创建实体管理器的工厂,负责配置 JPA ...

    EntityManager

    - 当实体正在被EntityManager管理时,可以直接修改实体的属性,然后在容器决定flush时(可能是事务提交时)同步到数据库。也可以主动调用`flush()`方法立即更新。 - 如果实体已与EntityManager分离,需调用`merge...

    JPA.rar_JAVAEE系统_JavaEE_Javaee jpa_订单管理

    在JavaEE平台上,Java Persistence API(JPA)是用于管理和持久化对象的规范,它为开发者提供了一种标准的方式来处理数据库交互。这个“JPA.rar”压缩包文件包含了一个基于JPA实现的订单管理系统的源代码,这为我们...

    尚硅谷JPA视频教程

    JPA视频_EntityManager(1) · 8. JPA视频_EntityManager(2) · 9. JPA视频_EntityManager(3) · 10. JPA视频_EntityManager(4) · 11. JPA视频_EntityTransaction · 12. JPA视频_映射单向多对一的关联关系 ...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    2. **实体管理器(EntityManager)**:负责实体的创建、查找、删除等操作,是JPA的主要接口。 3. **实体管理器工厂(EntityManagerFactory)**:用于创建实体管理器,是整个应用的单例对象。 4. **事务(Transaction...

    jpa学习笔记 介绍了jpa中state的概念和应用

    3. Detached:脱离了持久化上下文的实例,可能已经从数据库加载过,但不再受EntityManager管理。 4. Removed:已被标记为删除的实体,将在下一次事务提交时从数据库中移除。 状态转换通常涉及到以下操作: - New到...

    JPA中文解释,JPA的API

    例如,`EntityManager`是JPA的核心接口,负责管理实体的生命周期;`EntityTransaction`用于处理事务;而`Query`接口则提供了执行JPQL(Java Persistence Query Language)查询的能力。 标签中提到了"JPA注解参考_...

Global site tag (gtag.js) - Google Analytics