8
votes

Les transactions déclaratives (@TransActional) ne fonctionnent pas avec @Repository au printemps

J'essaie de faire une application simple à l'aide de la base de données Spring, JPA et H2 intégrée. Récemment, j'ai rencontré ce problème étrange avec les transactions déclaratives. Ils ne s'engagent tout simplement pas si j'attends mon DAO avec une annotation @RePository. Plus spécifiquement, je reçois une exception sur Flush:

@Controller
public class HomeController {

    @Inject
    JpaDao dao;

    @RequestMapping("/add")
    public @ResponseBody String add(String name) {
        Professor p = new Professor(name);
        dao.addProfessor(p);
        return ":)";
    }
}


4 commentaires

Essayez d'échanger @Inject pour @autowired


est


@beerbajay a essayé, même résultat.


Très utile, merci. Je me suis battu avec un problème similaire pour deux jours et je me déplace dans le contexte principal a également fonctionné pour moi. Merci.


3 Réponses :


0
votes

L'annotation @TransActional peut être placée avant une définition d'interface, une méthode sur une interface, une définition de classe ou une méthode publique sur une classe. Cependant, veuillez noter que la simple présence de l'annotation n'est pas suffisante pour allumer le comportement transactionnel - l'annotation @Transactional est simplement des métadonnées pouvant être consommées par quelque chose qui est @Transactional -aware et qui peut utiliser les métadonnées pour configurer les haricots appropriés avec un comportement transactionnel. Dans le cas de l'exemple ci-dessus, il s'agit de la présence de la qui passe sur le comportement transactionnel.

de printemps doc http://static.springsource.org /spring/docs/2.0.8/Reference/transaction.html


2 commentaires

Voulez-vous vraiment citer les documents de printemps à partir de la version 2.0.8?


Avez-vous même lu la question? J'ai eu dans mon contexte d'application . Je demande pourquoi le mettre en outre dans Contexte de servlet résout le problème.



0
votes

Juste une supposition, mais vous n'avez pas besoin d'enregistrer votre propre persistenceannotationBeanpostProcessor , puisque enregistre un automatiquement. Il est possible que les deux interfèrent les uns avec les autres.

Comme je l'ai dit, cependant, juste un hunch.


0 commentaires

5
votes

Probablement parce que le composant dans votre Spring-servle.xml comprend également vos classes DAO dans sa numérisation et crée donc des instances pour eux dans son contexte d'application ( Pas la "base de données" One) ... de sorte que lorsque votre Web accède à ces DAOS à partir de contrôleurs Web, il accède aux versions non transactionnelles d'entre eux (sauf si vous ajoutez que TX: TZ: Tag TX) .

Par conséquent, l'ajout de cette balise est en fait une mauvaise solution car elle crée toujours vos instances DAO dans le mauvais contexte d'application: mieux créer un plus spécifique de la configuration de la création de composants Web.

J'ai eu ce même problème parce que je pensais un dans mon printemps-servlet.xml prenait soin de seulement la numérisation @ Contrôleur classes ... mais non: - (


0 commentaires