@ManagedBean e @Transactional - bug in primavera? Soluzioni alternative?
-
28-10-2019 - |
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
- È questo a causa di un bug come questo?
- 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).
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.