2010-01-21 3 views
2

Je travaille sur une logique d'accès aux données avec Spring, ma question concerne les transactions. La documentation de transaction http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html montre que vous pouvez implémenter des transactions déclaratives ou programmatiques. J'ai choisi d'utiliser l'approche programmatique pour avoir un meilleur contrôle sur ce qui est traité.Transaction programmée de printemps avec le paramètre

Le modèle de base ressemble à ceci:

Product product = new Product(); 
// load properties 

// how do I pass my product object instance to my anonymous method? 
transactionTemplate.execute(
     new TransactionCallbackWithoutResult() 
     { 
     protected void doInTransactionWithoutResult (TransactionStatus status) 
     { 
     // transaction update logic here 
     return; 
     }}); 

Peut-être que je vais sur ce mal, mais, ma question est de savoir comment puis-je passer des arguments dans la méthode anonyme interne? La raison pour laquelle je veux faire ceci est que je puisse construire mon graphe d'objet avant de commencer la transaction (parce que les transactions devraient être aussi courtes que possible?) Je veux seulement qu'une fraction de la logique s'exécute dans la transaction mise à jour de la logique).

[modifier]

Jusqu'à présent, il semble que mon seul choix est d'utiliser une variable constante, ou tout simplement mettre toute logique à l'intérieur du délégué anonyme. Cela semble être un problème très commun ... comment avez-vous géré des situations comme celle-ci dans votre propre code?

Répondre

1

Pour des choses comme cela, j'utilise les éléments suivants ObjectHolder:

public class ObjectHolder<T> { 
    private T m_object; 

    public ObjectHolder(T object) { 
     m_object = object; 
    } 

    public T getValue() { 
     return m_object; 
    } 

    public void setValue(T object) { 
     m_object = object; 
    } 
} 

Ensuite, vous pouvez utiliser

final ObjectHolder<Product> productHolder = 
    new ObjectHolder<Product>(new Product()); 

... et à l'intérieur votre classe anonyme, vous pouvez accéder à votre Product avec

productHolder.getValue(); 

... ou changer est par exemple avec

productHolder.setValue(new Product()); 
4

Déclarez-le final. Anonymes classes internes ont accès à final variables locales:

public void someMethod() { 
    ... 
    final Product product = new Product(); 
    ... 
    transactionTemplate.execute( 
     new TransactionCallbackWithoutResult() 
     { 
      protected void doInTransactionWithoutResult (TransactionStatus status) 
      { 
       doSomething(product); 
       return; 
      }}); 
    ... 
} 
+0

Je ne peux pas, le produit est un type d'instance et il doit être chargé dans la méthode contenant et je ne veux pas en faire un membre de la classe variable soit. La méthode contenant sera appelée à plusieurs reprises, donc je ne pense pas que le rendre statique fonctionnerait à moins que je manque quelque chose. – James

+0

@James: Je veux dire une variable locale finale – axtavt

+0

Cette méthode sera appelée par différents threads, elle est utilisée dans une application web. Si je fais la variable locale finale qui ne serait pas sûre de thread serait-elle? – James

Questions connexes