Spring программная транзакция с параметром - PullRequest
2 голосов
/ 21 января 2010

Я работаю над логикой доступа к данным в Spring, мой вопрос касается транзакций. Документация по транзакциям http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html показывает, что вы можете реализовать декларативные или программные транзакции. Я решил использовать программный подход, чтобы лучше контролировать происходящее.

Основной шаблон выглядит так:

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;
       }}); 

Возможно, я поступаю неправильно, мой вопрос: как я могу передать аргументы во внутренний анонимный метод? Причина, по которой я хочу это сделать, заключается в том, чтобы я мог создать свой объект график до начала транзакции (потому что транзакции должны быть как можно более короткими по времени, не так ли?) Я хочу, чтобы только часть логики выполнялась в транзакции (логика обновления).

[править]

Пока, похоже, мой единственный выбор - использовать постоянную переменную или просто поместить всю логику в анонимный делегат. Это кажется очень распространенной проблемой ... как вы справлялись с подобными ситуациями в своем собственном коде?

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Объявите это final. Анонимные внутренние классы имеют доступ к final локальным переменным:

public void someMethod() {
    ...
    final Product product = new Product();
    ...
    transactionTemplate.execute( 
        new TransactionCallbackWithoutResult()  
        { 
            protected void doInTransactionWithoutResult (TransactionStatus status) 
            { 
                doSomething(product);
                return; 
            }}); 
    ...
}
1 голос
/ 21 января 2010

Для подобных вещей я использую следующее 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;
    }
}

Затем вы можете использовать

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

... и внутри вашего анонимного класса вы можете получить доступ к вашему Product с

productHolder.getValue();

... или измените его экземпляр с помощью

productHolder.setValue( new Product() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...