带参数的Spring程序化事务

时间:2010-01-21 19:46:07

标签: java hibernate spring transactions

我正在使用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 个答案:

答案 0 :(得分:4)

声明它final。匿名内部类可以访问final局部变量:

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

答案 1 :(得分:1)

对于这样的事情,我使用以下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() );