Question

J'ai eu le bean de support JSF suivant dans mon webapp

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

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

}

Quand il arrive au repository.save Appel de méthode - j'obtiens l'erreur suivante

no transaction is in progress

J'ai deux questions

  1. Est-ce à cause d'un bug comme ça?
  2. Je crois qu'il y a deux solutions de contournement - y en a-t-il d'autres?

2.1 Première solution de contournement - Utilisation

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

2,2 seconde de solution de contournement

Créez une classe d'assistance et annotez à la place.

2.3 (Une troisième solution de contournement possible consisterait à annoter @Transactional sur une méthode d'une classe intérieure, c'est assez similaire à 2.2).

Était-ce utile?

La solution

Lorsque vous utilisez des annotations de printemps (je sais que @Transactional est une norme Sun - mais vous avez besoin d'une implémentation) - Spring utilise AOP pour annoter à la classe pour ajouter le code de gestion des transactions. Cela ne fonctionne que pour les haricots de printemps. Si votre classe est un bean de support pour JSF - le framework Mojarra n'inservera pas son propre code de gestion des transactions à cette annotation.

Réponse courte - @Transactional Fonctionne pour les haricots chargés par le ressort. Sinon, vous devez trouver un cadre qui le prend en charge ou supposer qu'il ne fonctionnera pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top