根据以下示例类:
@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 方法中获取数据库事务?