`

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其他方法)

    EntityManager

    EntityManager管理,java jpa

    尚硅谷JPA视频教程

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

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

    基于SpringBoot搭建的一个信息管理系统,持久层代码使用JPA的EntityManager。SpringBoot初学者可以下载借鉴。

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

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

    JPA(hibernate) Dao 和 DaoSupport

    NULL 博文链接:https://godit.iteye.com/blog/1716651

    JPA 开发指导文档

    主要内容: JPA 体系架构 Entity Bean EntityManager JPA Query

    使用SpringBoot-JPA进行自定义保存及批量保存功能

    主要介绍了使用SpringBoot-JPA进行自定义的保存及批量保存功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    spring+jpa

    也是最具意义的,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理,开发者不需要关心这些,如前面的代码所示,业务方法中只剩下操作领域对象的代码,事务管理和 EntityManager 创建...

    OpenJPA 2.2.1 API (CHM格式)

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

    spring4 mvc + jpa demo

    pom.xml 的引入的相关jar版本配置 ... <hibernate-entitymanager.version>4.1.0.Final</hibernate-entitymanager.version> <hibernate-jpa.version>1.0.1.Final</hibernate-jpa.version> </properties>

    JPA开发手册

    JPA开发文档 1. 发展中的持久化技术 2 1.1 JDBC 2 1.2关系对象映射(Object Relational Mapping,ORM) 2 1.3 Java数据对象(Java Data Object,JDO) 2 1.4 Java Persistence API(JPA) 2 2. JPA体系架构 3 清单1...

    spring-jpa-hibernate:使用Spring Data JPA和Hibernate作为JPA提供者的示例应用程序

    直接访问JPA EntityManager ,以对数据库交互进行细粒度控制 集合大小 查找映射集合的大小,而不必加载集合中的所有元素 多个EntityManager 在单个应用程序中使用多个EntityManager 手动标识符生成 手动生成实体...

    Java工作笔记-JPA中使用@query注解(分页查询实例)

    运行截图如下: 这里对应的数据库内容如下: 此处的关键代码如下: 通过sql语句去做,这里nativeQuery = true,这样就可以使用原始的sql语句了 其实真实的分页是这样的:limit (page – 1) * size , size ...

    spring boot整合JPA——demo

    spring boot整合JPA——demo

    hibernate-entitymanager JAR包

    hibernate EntityManager是围绕提供JPA编程接口的Hibernate Core的一个包装,支持JPA实体实例的生命周期,并允许你用标准的Java Persistence查询语言编写查询

    SpringData框架中的JPA工具类

    SpringData框架中使用的JPA工具类.模板代码,解决实体管理器工厂的浪费资源和耗时问题.第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象,第二次方法...

    国外java源码社区-graphql-jpa-query:为您的JPA实体模型生成GraphQL查询Api

    EntityManager Api 生成 GraphQL 架构,并使用 JPA 查询数据提取器检测 GraphQL 架构,将 GraphQL 查询即时转换为 JPA 查询。 GraphQL 是一种由 GraphQL Java 运行时实现的 Web API 查询语言,用于使用现有数据完成...

    hibernate-entitymanager-4.2.21.Final

    配置hibernate jpa所需jar包,为hibernate的entitymanager等提供支持

    hibernate-entitymanager-3.4.0.GA.rar

    hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA....hibernate支持jpa用~

Global site tag (gtag.js) - Google Analytics