Pregunta

Tuve el siguiente bean de respaldo de JSF en mi aplicación web

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

    @Transactional 
    public void save() {
        ....
        repository.save(myObject);
    }

}

Cuando llega al repository.save Llamada de método: recibo el siguiente error

no transaction is in progress

Tengo dos preguntas

  1. ¿Es esto por un error? como esto?
  2. Creo que hay dos soluciones: ¿hay otros?

2.1 Primera solución - usando

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    repository.save(myObject);
  }
});

2.2 segundos solucionadores

Cree una clase de ayudante y anote eso en su lugar.

2.3 (Una posible tercera solución sería anotar @Transactional en un método de una clase interna, esto es bastante similar a 2.2).

¿Fue útil?

Solución

Al usar anotaciones de primavera (sé que @Transactional es un estándar de sol, pero necesita una implementación): Spring usa AOP para anotar a la clase para agregar el código de manejo de transacciones. Esto solo funciona para los frijoles de primavera. Si su clase es un frijol de respaldo para JSF: el marco Mojarra no inserta su propio código de manejo de transacciones en esta anotación.

Respuesta corta - @Transactional Funciona para frijoles cargados por primavera. De lo contrario, debe encontrar un marco que lo respalde o asumiera que no funcionará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top