Java 带参数的Spring编程事务
我正在用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
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() );