【问题标题】:How can I get a database transaction in a JAX-RS method which does operations on many JPA entities?如何在对许多 JPA 实体进行操作的 JAX-RS 方法中获取数据库事务?
【发布时间】:2013-08-19 02:21:02
【问题描述】:

根据以下示例类:

@Stateless
@Path("/evento")
public class EventoEndpoint {

    @PersistenceContext
    private EntityManager em;

    @POST
    @Consumes("application/json")
    public Response create(Evento entity) throws Exception {            

        // Get a record from Bitacora table
        TypedQuery<Bitacora> findBitacora = em.createQuery(
                    "SELECT b FROM Bitacora b WHERE b.id = :bitacoraId",
                    Bitacora.class);
        findBitacora.setParameter("bitacoraId", entity.getBitacora().getId());
        Bitacora bitacora = findBitacora.getSingleResult();

        // Increment by one a field from the current bitacora record
        Long interno = bitacora.getInterno() + 1;

        // Assign the new number to entity.interno property
        entity.setInterno(interno);

        // Update number in bitacora record
        bitacora.setInterno(interno);

        // save bitacora record
        em.persist(bitacora);

        // an intentionally launched exception
        if (interno > 0) throw new Exception("error en el sistema");

        // save the entity
        em.persist(entity); 

        // return a response
        return Response.ok(user).build();
    }
}

我预计在这种情况下,从 HTTP 客户端对 post 方法的调用必须启动异常,因此所涉及的数据库操作必须回滚。

这意味着,数据库记录根本不应该有任何变化。

显然这没有发生,因为在启动该方法后,数据库中的一个实体(bitacora)受到影响,而另一个实体(evento)则不受影响。

那么,我的代码出了什么问题,或者如何在 JAX-RS 方法中获取数据库事务?

【问题讨论】:

    标签: jakarta-ee jpa jax-rs jta


    【解决方案1】:

    默认情况下,EJB 中的已检查异常是应用程序异常。除非配置为这样做,否则抛出应用程序异常不会回滚事务。

    你可以

    • 通过@ApplicationException(rollback=true) 或部署描述符配置您的异常以回滚事务。
    • 调用EJBContext.setRollbackOnly()方法显式回滚事务。

    规范包含支持事务和异常处理章节中的所有细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      相关资源
      最近更新 更多