如何使用JAX-RS,Spring和JPA管理事务

如何使用JAX-RS,Spring和JPA管理事务,第1张

概述我正在使用JAX-RS提供基于HTTP的界面来管理数据模型.数据模型存储在数据库中并通过JPA进行交互.这允许我修改数据模型的接口以适应REST客户端,并且大多数似乎工作得很好.但是,我不确定如何处理由JAX-RS资源提供的方法需要事务的情况,这会影响JPA get,update,commit-on-tx-end模式,因为只有事务包装get *** 作,因此永远不会

我正在使用JAX-RS提供基于http的界面来管理数据模型.数据模型存储在数据库中并通过JPA进行交互.

这允许我修改数据模型的接口以适应REST客户端,并且大多数似乎工作得很好.但是,我不确定如何处理由JAX-RS资源提供的方法需要事务的情况,这会影响JPA get,update,commit-on-tx-end模式,因为只有事务包装get *** 作,因此永远不会提交更新.如果单个REST *** 作需要多个JPA *** 作,我可以看到同样的问题.

当我使用Spring的事务支持时,显而易见的事情是将@Transactional应用于JAX-RS资源中的这些方法.但是,为了实现这一点,Spring需要管理JAX-RS资源的生命周期,而我所知道的使用示例在需要时通过“new”创建资源,这让我有点紧张.

我可以想到以下解决方案:

>更新我的JPA方法,以原子方式从我的REST接口提供我想要做的所有事务的事务管理版本.应该工作,将事务保持在JAX-RS层之外,但是阻止了get,这意味着我需要创建一个非常精细的JPA接口.
>注入资源对象;但它们通常是有状态的,至少保持与之交互的对象的ID
>抛弃资源层次结构,在根部注入大型无状态超级资源,从根目录管理整个层次结构;没有凝聚力,大服务
>拥有一个注入的,无状态的,支持事务的辅助对象的层次结构,它们“遮蔽”实际资源;资源被实例化并保存状态,但是将方法调用委托给辅助对象

有人有什么建议吗?我很可能错过了某个关键点.

更新 – 为了解决get,commit-on-tx-close流程周围缺少事务的问题,我可以公开EntityManager merge(object)方法并手动调用它.不整齐,但不能解决更大的问题.

更新2 @skaffman
代码示例:
在JPA服务层,注入,注释工作

public class MyEntityJPAService {...@Transactional(Readonly=true) // do in transactionpublic MyEntity getMyEntity(final String ID) {    return em.find(MyEntity.class,ID);}

在JAX-RS资源中,由new创建,没有事务

public class MyEntityResource {...private MyEntityJPAService jpa;...@Transactional // not injected so not effectivepublic voID updateMyEntity(final String ID,final MyEntityRepresentation rep) {    MyEntity entity = jpa.getMyEntity(ID);    MyEntity.setSomeFIEld(rep.getSomeFIEld());    // no transaction commit,change not saved...}
最佳答案我有一些建议

>在JPA和JAX-RS图层之间引入一个图层.该层由Spring管理的@Transactional bean组成,并将从其组件JPA调用组成各种业务级 *** 作.这有点类似于你的(1),但保持JPA层简单.
>用Spring-MVC替换JAX-RS,它提供相同(或类似)的功能,包括@ PathVariable,@ ResponseBody等.
>使用TransactionProxyfactorybean以编程方式将JAX-RS对象包装在事务代理中.这将删除您的@Transactional注释并生成一个尊重它们的代理.
>使用@Configurable和AspectJ LTW,即使使用`new创建对象,Spring也可以使用@Transactional.见8.8.1 Using AspectJ to dependency inject domain objects with Spring 总结

以上是内存溢出为你收集整理的如何使用JAX-RS,Spring和JPA管理事务全部内容,希望文章能够帮你解决如何使用JAX-RS,Spring和JPA管理事务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258391.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存