提问者:小点点

javax.持久性. RollbackException:标记为rollbackOnly的事务


我正在用SpringMVC制作一个游戏。我有一个获取游戏和更新的方法,但是当它更新时会出现错误,这是代码:

HomeController. class

@Transactional
@RequestMapping(value = "/partida/{idPartida}", method = RequestMethod.GET)
public String getPartida(@PathVariable("idPartida") long idPartida,
        Model model) throws IOException {
    Partida p = ServicioAplicacionPartida.getPartida(entityManager,
            idPartida);

    if (p.getJson() == null) {
        p.inicializarPartida(entityManager);
        ServicioAplicacionPartida.update(entityManager, p);
    }

@Transactional
public static Partida update(EntityManager entityManager, Partida p) {
    try {               
        Query q = entityManager.createNativeQuery("update Partida p SET p.json=:json where p.id=:id");
        q.setParameter("json", p.getJson());
        q.setParameter("id", p.getId());
        q.executeUpdate();
        return entityManager.find(Partida.class, p.getId());
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

错误发生在执行“q.执行Udate()”行时,这里是:

javax.持久化.持久化异常:org. hibernate.异常.DataException:无法执行语句

这是服务器错误:

EstadoHTTP500-请求处理失败;嵌套异常是org. springframe.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.持久性。RollbackException:标记为rollbackOnly的事务

我能做些什么来修复它?


共1个答案

匿名用户

您有注释控制器和DAO方法作为@Transactional,这是不正确的,因为@Transactional可以继承到内部方法。通常事务应该从服务层开始。

尝试将这些参数添加到@Transactional注解并将其从Controller或DAO中删除:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Exception.class)