1.0jpa 2.0

JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API ,它表示操纵一个资源的组件(例如,使用其JDBC驱动程序操纵的具体数据库)。 默认情况下,容器管理的持久性上下文的类型为SynchronizationType.SYNCHRONIZED ,即,该持久性上下文自动加入当前的JTA事务,并将对持久性上下文的更新传播到基础资源管理器。

通过创建新类型为SynchronizationType.UNSYNCHRONIZED的持久性上下文,将禁用事务的自动连接以及将更新传播到资源管理器。 为了加入当前的JTA事务,代码必须调用EntityManager joinTransaction()方法。 这样,EntityManager的持久性上下文将在事务中登记,并为后续通知注册。 提交或回滚事务后,持久性上下文将离开事务,并且在新的JTA事务再次调用joinTransaction()方法之前,持久上下文不会附加到任何其他事务。

JPA 2.1之前,一个可以实现与一个跨越多个方法调用的对话@Stateful由亚当边描述会话Bean 在这里 :

@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class Controller {@PersistenceContext(type = PersistenceContextType.EXTENDED)EntityManager entityManager;public Person persist() {Person p = new Person();p.setFirstName("Martin");p.setLastName("Developer");return entityManager.merge(p);}public List<Person> list() {return entityManager.createQuery("from Person", Person.class).getResultList();}@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)public void commit() {}@Removepublic void remove() {}
}

持久性上下文的类型为EXTENDED ,因此,其生存期比它所附加的JTA事务的寿命长。 由于持久性上下文默认也是SYNCHRONIZED类型,因此它将在调用任何会话bean的方法时自动加入正在运行的任何事务。 为了防止大多数Bean方法发生这种情况,注释@TransactionAttribute(TransactionAttributeType.NEVER)告诉容器不要为该Bean打开任何事务。 因此,方法persist()list()无需事务即可运行。 对于方法commit()此行为是不同的。 在这里,注释@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)告诉容器在调用该方法之前创建一个新事务,因此Bean的EntityManager将自动加入该事务。

使用新的SynchronizationType.UNSYNCHRONIZED类型,可以如以下清单所示重写上面的代码:

@Stateful
public class Controller {@PersistenceContext(type = PersistenceContextType.EXTENDED,synchronization = SynchronizationType.UNSYNCHRONIZED)EntityManager entityManager;public Person persist() {Person p = new Person();p.setFirstName("Martin");p.setLastName("Developer");return entityManager.merge(p);}public List<Person> list() {return entityManager.createQuery("from Person", Person.class).getResultList();}public void commit() {entityManager.joinTransaction();}@Removepublic void remove() {}
}

现在,EntityManager不会自动加入当前事务,我们可以省略@TransactionAttribute批注。 在我们明确加入之前,任何正在运行的事务都不会对EntityManager产生影响。 现在,这是在commit()方法中完成的,甚至可以基于某些动态逻辑来完成。

为了测试上面的实现,我们利用了一个简单的REST资源:

@Path("rest")
@Produces("text/json")
@SessionScoped
public class RestResource implements Serializable {@Injectprivate Controller controller;@GET@Path("persist")public Person persist(@Context HttpServletRequest request) {return controller.persist();}@GET@Path("list")public List<Person> list() {return controller.list();}@GET@Path("commit")public void commit() {controller.commit();}@PreDestroypublic void preDestroy() {}
}

此资源提供了持久化人员,列出所有持久化人员并提交当前更改的方法。 当我们将使用有状态会话Bean时,我们使用@SessionScoped注释资源,并让容器注入Controller Bean。

在将应用程序部署到某个Java EE容器后,通过调用以下URL,一个新人员将被添加到非同步的持久性上下文中,但不会存储在数据库中。

http://localhost:8080/jpa2.1-unsychronized-pc/rest/persist

即使调用list()方法也不会返回新添加的人员。 只有最终通过调用commit()将持久性上下文中的更改与基础资源同步,才将insert语句发送到基础数据库。

结论

持久性上下文的新UNSYNCHRONIZED模式使我们可以通过状态会话bean的多个方法调用来实现对话,并且可以灵活地根据我们的应用程序逻辑动态地加入JTA事务,而无需任何注释魔术。

  • PS:源代码可从github获得 。

翻译自: https://www.javacodegeeks.com/2015/03/jpa-2-1-unsynchronized-persistence-context.html

1.0jpa 2.0

1.0jpa 2.0_JPA 2.1:不同步的持久性上下文相关推荐

  1. JPA 2.1:不同步的持久性上下文

    JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步. 术语资源管理器来自Java事务处理API ,它表示操纵一个资源的组件(例如,使用JDBC驱动程序操纵的具 ...

  2. 1.0jpa 2.0_Java EE 7之前版本替代JPA 2.1非同步持久性上下文

    1.0jpa 2.0 Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念,该概念允许对JPA实体管理器的刷新进行细粒度控制,即通过显式调用EntityManager ...

  3. Java EE 7之前版本替代JPA 2.1的非同步持久性上下文

    Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念,该概念允许对JPA实体管理器的刷新进行细粒度控制,即通过显式调用EntityManager#joinTransa ...

  4. 1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0

    1.0jpa 2.0 美丽在于情人眼中. "轻松"也是如此: 了解有关SQL结果集映射的更多信息,并轻松处理本机查询结果: http : //t.co/WH4BTlClIP #JP ...

  5. 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图

    1.0jpa 2.0 延迟加载通常是JPA 2.0的问题. 如果要使用FetchType.LAZY(默认)或FetchType.EAGER来加载关系,则必须在实体上进行定义,并且始终使用此模式. 仅当 ...

  6. 1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

    1.0jpa 2.0 可以使用JPA 2.0保留枚举,但是没有很好的方法来实现. 使用@Enumerated批注,可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到 ...

  7. hibernate自动配置_Hibernate自动冲洗的黑暗面

    hibernate自动配置 介绍 既然我已经描述了JPA和Hibernate刷新策略的基础知识 ,我就可以继续阐明Hibernate的AUTO刷新模式的令人惊讶的行为. 并非所有查询都会触发会话刷新 ...

  8. 休眠自动冲洗的黑暗面

    介绍 既然我已经描述了JPA和Hibernate刷新策略的基础知识 ,我就可以继续阐明Hibernate的AUTO刷新模式的令人惊讶的行为. 并非所有查询都会触发会话刷新 许多人会认为Hibernat ...

  9. object转class_从零并发框架(三)异步转同步注解+字节码增强代理实现

    序言 上一节我们学习了异步查询转同步的 7 种实现方式,今天我们就来学习一下,如何对其进行封装,使其成为一个更加便于使用的工具. 思维导图如下: 异步转同步字节码增强 拓展阅读 java 手写并发框架 ...

最新文章

  1. Old News PDC2003
  2. 【嵌入式】C语言高级编程-container_of宏(04)
  3. python 怎么安装电脑摄像头模块_Python模块及安装
  4. python的正则表达式 re
  5. 服务器无法通过系统非页面共享区进行分配,服务器无法通过系统非页面共享区来进行分配的解决方法...
  6. (37)FPGA三种基本逻辑门(非门)
  7. 全面解析Java的垃圾回收机制(转)
  8. sun服务器清理内存日志_服务器清理日志的命令行
  9. 如何在旅途中提升 MacBook 电池电量?
  10. 安卓app开发-02-安卓app快速开发
  11. figure函数--Matplotlib
  12. “互联网+”时代,网络安全市场将达千亿级别
  13. android: Apostrophe not preceded by \ 错误
  14. 全球与中国多模连续光纤激光器市场现状及未来发展趋势
  15. 在windows和Deepin上安装Fedora33-KDE:一波三折、第九次成功的嘤嘤怪
  16. css3 svg 背景图 data:image/svg+xml;base64
  17. 小程序中wxs的使用
  18. 从一文中了解SSRF的各种绕过姿势及攻击思路
  19. 备份vmware虚拟机,failed. Error 2 (Memory allocation failed. Out of memory.) (DiskLib error 802
  20. EasyFloat:浮窗从未如此简单

热门文章

  1. YbtOJ#593-木棍问题【费用流】
  2. P4068-[SDOI2016]数字配对【二分,费用流】
  3. bzoj2111,P2606-[ZJOI2010]排列计数【Lucas,组合计数,dp】
  4. 【AC自动机】病毒代码(ybtoj AC自动机-5)
  5. Summer Training day4 欧拉降幂
  6. JavaFX官方教程(十)之转换类型和示例
  7. vue组件自定义v-model
  8. 图解HashMap和HashSet的内部工作机制
  9. css解决li边框重合问题
  10. TS字面量进行类型声明