1

根据以下示例类:

@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 方法中获取数据库事务?

4

1 回答 1

2

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

你可以

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

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

于 2013-08-17T09:32:02.087 回答