Domanda

Avevo il seguente JSF Backing Bean nel mio WebApp

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

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

}

Quando arriva al repository.save Metodo Chiama: ottengo il seguente errore

no transaction is in progress

Ho due domande

  1. È questo a causa di un bug come questo?
  2. Credo che ci siano due soluzioni alternative: ce ne sono altri?

2.1 Prima soluzione alternativa - Utilizzo

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

2,2 Seconda soluzione alternativa

Crea una classe helper e annotalo invece.

2.3 (una possibile terza soluzione alternativa sarebbe quella di annotare @Transactional su un metodo di una classe interna che è abbastanza simile a 2.2).

È stato utile?

Soluzione

Quando si utilizza le annotazioni primaverili (lo so @Transactional è uno standard Sun - ma hai bisogno di un'implementazione) - Spring utilizza AOP per annotare la classe per aggiungere il codice di gestione delle transazioni. Questo funziona solo per i fagioli primaverili. Se la tua classe è un bean di supporto per JSF, il framework di Mojarra non inserirà il proprio codice di gestione delle transazioni a questa annotazione.

Risposta breve - @Transactional Funziona per i fagioli caricati dalla primavera. Altrimenti è necessario trovare un framework che lo supporti o presumi che non funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top