前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JPA EntityManager详解

JPA EntityManager详解

作者头像
py3study
发布2020-01-09 20:32:18
2K0
发布2020-01-09 20:32:18
举报
文章被收录于专栏:python3python3python3

应用程序管理的EntityManager(Application-Managed EntityManager)

Ø 在JavaSE和JavaEE环境下创建应用程序管理的EntityManager的不同之处,并非创建EntityManager的方式不同,而是获得创建EntityManager的EntityManagerFactory的方式不同。

ü JavaSE环境:Persistence.createEntityManager(“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实例销毁才消失。

4. 容器管理的事务 之 容器管理的持久化上下文

Ø JPA支持两种事务类型:

ü 本地资源事务(RESOURCE_LOCAL):使用JDBC驱动管理的本地事务。

ü Java事务API(JTA):可用于管理分布式事务,管理多数据源的情况。

ü 容器管理的EntityManager总是使用JTA事务。应用程序管理的EntityManager可以使用本地资源事务,也可以使用JTA事务。

ü 在JavaSE环境下,默认的事务类型是RESOURCE_LOCAL,而在JavaEE环境下,默认的事务类型是JTA。

ü 事务类型在persistence.xml中定义。

Ø 只能有一个持久化上下文与JTA关联,并且只能有一个持久化上下文在事务中传播。

Ø 对于容器管理的EntityManager,在同一事务中必须使用相同的持久化上下文。

Ø 事务范围内的持久化上下文:事务范围内的持久化上下文将其生命周期绑定到某个事务,在需要的时候,事务范围内的持久化上下文由事务范围内的EntityManager负责创建,之所以说“在需要的时候”,是因为事务范围内的持久化上下文是“懒加载”的,只有在EntityManager实例调用相关的数据访问方法并且当前不存在可用的持久化上下文的时候,才会创建持久化上下文。

Ø 扩展的持久化上下文:扩展的持久化上下文与有状态会话Bean绑定。不同于事务范围内的持久化上下文为每一个事务创建一个新的持久化上下文,有状态会话Bean中扩展的EntityManager总是使用相同的持久化上下文。有状态会话Bean总是只和一个持久化上下文绑定,并且在有状态会话Bean创建时创建该持久化上下文,在有状态会话Bean销毁时注销该持久化上下文。也就是说,不同于事务范围内的持久化上下文,扩展的持久化上下文不是“懒加载”的。

Ø 持久化上下文的冲突:当调用某个方法时有若干个持久化上下文,则会出现持久化上下文冲突,抛出异常。有个特殊情况,即在一个有状态会话Bean的扩展持久化上下文中调用另一个有状态会话Bean的方法,并且被调用的会话Bean也使用扩展持久化上下文,这样当调用被调用的会话Bean中方法时虽有两个持久化上下文可用,但并不会出现冲突。被调用的会话Bean继承调用者的持久化上下文。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4. 容器管理的事务 之 容器管理的持久化上下文
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档