代码之家  ›  专栏  ›  技术社区  ›  James

带参数的Spring编程事务

  •  2
  • James  · 技术社区  · 15 年前

    我正在用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 回复  |  直到 15 年前
        1
  •  1
  •   tangens    15 年前

    对于这样的事情,我使用以下方法 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() );
    
        2
  •  4
  •   axtavt    15 年前

    申报 final . 匿名内部类可以访问 局部变量:

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