Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带参数的Spring编程事务_Java_Hibernate_Spring_Transactions - Fatal编程技术网

Java 带参数的Spring编程事务

Java 带参数的Spring编程事务,java,hibernate,spring,transactions,Java,Hibernate,Spring,Transactions,我正在用Spring研究一些数据访问逻辑,我的问题与事务有关。事务文档显示您可以实现声明式或编程式事务。我选择使用编程方法,以便更好地控制事务处理 基本模式如下所示: Product product = new Product(); // load properties // how do I pass my product object instance to my anonymous method? transactionTemplate.execute( new Tr

我正在用Spring研究一些数据访问逻辑,我的问题与事务有关。事务文档显示您可以实现声明式或编程式事务。我选择使用编程方法,以便更好地控制事务处理

基本模式如下所示:

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;
       }}); 
也许我这样做是错误的,但是,我的问题是如何将参数传递到内部匿名方法?我想这样做的原因是,我可以在开始事务之前构建对象图(因为事务应该尽可能短的时间,对吧?)我只想在事务中运行一小部分逻辑(更新逻辑)

[编辑]


到目前为止,我唯一的选择似乎是使用常量变量,或者只是将所有逻辑放在匿名委托中。这似乎是一个非常常见的问题……您如何在自己的代码中处理这种情况?

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

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

对于这种情况,我使用以下
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;
    }
}
…或使用

productHolder.setValue( new Product() );

我不能,product是一个实例类型,需要在包含方法中加载它,我也不想让它成为类成员变量。containing方法将被重复调用,因此我认为除非我遗漏了某些内容,否则将其设置为静态将无法工作。@James:我的意思是最终的局部变量此方法将由web应用程序中使用的不同线程调用。如果我将局部变量设为final,那么它会不会是线程安全的?变量上的
final
关键字标记该变量为常量。它不像C++James中的
静态
——请这样想。someMethod在线程1中执行,定义产品并冻结。someMethod在线程2中执行并定义product product,但它有自己的产品-它没有覆盖线程1中的产品,因为线程1的产品只存在于线程1的执行中。当线程2放弃,线程1恢复时,线程1的产品仍然存在——在执行两个线程可以同时使用的方法时,必须小心使用实例变量。
productHolder.getValue();
productHolder.setValue( new Product() );