2009-08-05 4 views
3

Comment puis-je valider que tous les accès JDBC se produisent sur une transaction active, , c'est-à-direjava.sql.Connection.getAutoCommit() toujours renvoyer false? J'utilise Spring pour la gestion des transactions (@Transactional) et Hibernate pour l'accès aux données.Validation de tous les appels JDBC dans une transaction


Mise à jour: Ce qui arrive est que certains accès Hibernate est effectuée sans la méthode de service étant annotée avec @Transactional. C'est ce que je veux être averti.

Mise à jour 2: Code échantillon

Il est possible d'appeler le code suivant:

public ServiceImpl implements Service { 

    // missing @Transactional 
    public List<String> getSomeIds() { 
      return getDao().getSomeIds(); 
    } 
} 

Répondre

2

Utilisez PROPAGATION_REQUIRED sur toutes les méthodes persistantes.

+0

Merci pour la réponse. Ce qui se passe, c'est que certains accès Hibernate sont effectués sans que la méthode de service soit annotée avec @Transactional. C'est ce que je veux être averti. –

+0

Veuillez donner un exemple d'accès Hibernate sans la méthode de service. Tout devrait se passer à travers la couche de service. Vous pouvez écrire un aspect pour interdire expressément l'accès DAO en dehors de la couche de service si vous le souhaitez. – duffymo

+0

J'ai ajouté un exemple de code. Est-ce que cela clarifie la question? –

1

En fait, vous ne devriez pas avoir à le faire, puisque selon the @Transactional documentation, section 9.5.6.1:

Les paramètres par défaut sont @Transactional:

The propagation setting is PROPAGATION_REQUIRED 
.... 

PROPAGATION_REQUIRED signifie:

Prendre en charge une transaction en cours, en créer une nouvelle si aucune n'existe.

EDIT: Votre meilleur pari est probablement de faire ce que @duffymo a dit dans son commentaire:

Vous pouvez écrire un aspect d'interdire expressément l'accès DAO en dehors de la couche de service si vous le souhaitez.

+0

Merci pour la réponse. Ce qui se passe, c'est que certains accès Hibernate sont effectués sans que la méthode de service soit annotée avec @Transactional. C'est ce que je veux être averti. –

+0

J'ai ajouté un exemple de code. Est-ce que cela clarifie la question? –

2

Une façon je peux penser est de mettre en œuvre et enregistrer un pilote JDBC factice pour agir comme un intercepteur entre les déclarations que vous souhaitez surveiller ainsi que de garder un journal lorsque la connexion # setAutoCommit() et connexion # engagent() est appelé pour connaître les limites de la transaction.

Questions connexes