【问题标题】:How to manage transactions with JAX-RS, Spring and JPA如何使用 JAX-RS、Spring 和 JPA 管理事务
【发布时间】:2012-03-25 00:03:27
【问题描述】:

我正在使用 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”创建资源,这让我有点紧张。

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

  1. 更新我的 JPA 方法,以原子方式提供我想要从我的 REST 接口执行的所有操作的事务管理版本。应该可以工作,将事务排除在 JAX-RS 层之外,但会阻止 get、update、commit-on-tx-end 模式,这意味着我需要创建一个非常精细的 JPA 接口。
  2. 注入资源对象;但它们通常是有状态的,至少持有与之交互的对象的 ID
  3. 抛弃资源层次结构,在根目录注入大型无状态超级资源,从该根目录管理整个层次结构;没有凝聚力的大服务
  4. 具有注入的、无状态的、支持事务的辅助对象的层次结构,可以“隐藏”实际资源;资源被实例化并保持状态,但将方法调用委托给辅助对象

有人有什么建议吗?我很可能在某处遗漏了一些关键点。


更新 - 为了解决在获取、更新、提交时提交-关闭流程中缺少事务的问题,我可以公开 EntityManager 合并(对象)方法并手动调用它。不整洁,但不能解决更大的问题。


更新 2 @skaffman 代码示例: 在 JPA 服务层,注入,注解起作用

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

在 JAX-RS 资源中,由新创建,无事务

public class MyEntityResource {
...
private MyEntityJPAService jpa;
...
@Transactional // not injected so not effective
public void updateMyEntity(final String id, final MyEntityRepresentation rep) {
    MyEntity entity = jpa.getMyEntity(id);
    MyEntity.setSomeField(rep.getSomeField());
    // no transaction commit, change not saved...
}

【问题讨论】:

    标签: spring jpa transactions jax-rs


    【解决方案1】:

    我有一些建议

    1. 在 JPA 和 JAX-RS 层之间引入一个层。该层将由 Spring 管理的 @Transactional bean 组成,并将通过其组件 JPA 调用组成各种业务级操作。这有点类似于您的 (1),但保持 JPA 层简单。

    2. 将 JAX-RS 替换为 Spring-MVC,提供相同(或相似)功能,包括@PathVariable@ResponseBody 等。

    3. 使用 TransactionProxyFactorybean 以编程方式将您的 JAX-RS 对象包装在事务代理中。这将检测您的 @Transactional 注释并生成一个支持它们的代理。

    4. 即使您使用 `new.见8.8.1 Using AspectJ to dependency inject domain objects with Spring

    【讨论】:

    • 这些建议是否按优先顺序排列(根据您)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2017-12-23
    • 2016-12-26
    • 2013-02-17
    • 2018-10-24
    • 2016-08-20
    相关资源
    最近更新 更多