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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 保存时清空iuput_vue清空input file

Coding源码学习第四部分&lpar;Masonry介绍与使用&lpar;三&rpar;&rpar;接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...python 线性回归示例说明:此文的第一部分参考了这里 用python进…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

@namedqueries_在@NamedQueries中枚举@NamedQuery

namedqueries介绍 如果您是使用JPA的Java开发人员&#xff0c;则很可能在实体上声明了一个或多个NamedQuery对象。 要在类上声明NamedQuery &#xff0c;必须在类中简单地用查询名称及其JPQL进行注释&#xff0c;例如&#xff1a; Entity NamedQuery(name "findAllProj…

ue4 设置intellisence_UE4.22编辑器界面操控设置(4)

视频课程地址&#xff1a;https://i.youku.com/i/UMzE2NDk2OTIw/custom?spma2hzp.8244740.0.0&id32318-在场景中按住鼠标左键上下移动鼠标&#xff0c;摄像机可以在场景中前后移动&#xff0c;左右移动鼠标&#xff0c;在场景中视角会左右旋转。-在场景中按住鼠标右键&…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

天刀服务器维护时间,6月3日服务器例行维护公告(已完成)

一、重要更新天地风云联赛1、摧毁敌方天芒之塔后除了给本方少侠增加一层士气之外&#xff0c;还会给本方少侠增加一层攻击增益和防御增益。2、击败敌方护卫弓箭手不会给本方少侠增加士气。3、无双之影登场时间提前&#xff1a;比赛还剩15分钟无双之影第一次登场&#xff0c;比赛…

python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...

1.2 解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时&#xff0c;会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来&#xff1f;解决方案Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我&#xff0c;了解更多咨询初学C语言&#xff0c;首先要接触的就是数据类型了&#xff0c;这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型&#xff0c;因为对计算机及原理知之甚少。所以&#xff0c;在学习数据类型之前&#x…

香辣弹簧:不同的自动接线方式

我想展示使用Spring的Autowired批注的不同方式&#xff1a; Constructor &#xff0c; Method和Field自动装配。 我展示的示例都是byType自动装配模式的一种形式&#xff08; constructor自动装配模式类似于byType &#xff09;。 请参阅Spring参考指南 &#xff0c;以获取有关…

windows服务器系统免登录,Mac系统登录Windows服务器

#### 操作场景下载地址&#xff1a;[Microsoft Remote Desktop for Mac](https://soft.wnana.com/Microsoft_Remote_Desktop_10.3.12_installer.pkg)本节操作以“Windows Server 2012 R2 数据中心版 64位”操作系统为例&#xff0c;介绍如何通过Microsoft Remote Desktop for M…

android module中获取 app_Android组件化架构 - 4. 动态创建

Android 组件化中使用动态创建的作用是解耦&#xff1b;1. 反射机制反射有两个作用&#xff1a;1.反编译&#xff1a;.class->.java;2.通过反射机制访问java对象中的属性&#xff0c;方法&#xff0c;构造器等&#xff1b;实现反射&#xff0c;实际上是得到Class对象2. 动态…

小白适用的C语言数据类型转换及转换规则

点击上方蓝字关注我&#xff0c;了解更多咨询1.不同类型数据间的混合运算与类型转换&#xff1a;①若参与运算量的类型不同&#xff0c;则先转换成同一类型&#xff0c;然后进行运算②转换按数据长度增加的方向进行&#xff0c;以保证精度不降低。如int型和long型运算时&#x…

jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs通常&#xff0c;利用图表提供数据的直观表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起&#xff0c;我们可以创建自定义图表…

永恒之塔修改服务器,[搬运工]永恒之塔单机版7.8 德国最新服务端

有高手整整吗&#xff01;搞了一天服务器启动不了啊…安装教程&#xff1a;1&#xff0c;安装【jdk-14】&#xff0c;切记&#xff0c;默认安装&#xff0c;不要修改路径等不出意外默认路径应该是【C:\Program Files\Java\jdk-14】2&#xff0c;注意&#xff1a;安装好【JDK】之…

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议&#xff0c;所以使用上会比tcp简单&#xff0c;他和tcp一样&#xff0c;使用四元组来标记通信的双方&#xff08;单播的情况下&#xff09;。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程&#xff08;伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询很多同学纠结自己应该学C语言还是学Java&#xff0c;本篇文章带你细致了解C语言与Java的各方面的不同之处&#xff0c;让你能够更全面的把握编程语言&#xff01;1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率…

java 编程工具_Java开发工具可以促进编程!

java 编程工具Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法&#xff0c;以使他们的编程工作变得更轻松。 由于情况发生了变化&#xff0c;因此出现了越来越多的工具。 因此&#xff0c;下面列出了大多数开发人员已经使用&#xff0c;将来使用或一定会使用的有用…