Spring Transactional Management - 在何处放置注释?

时间:2010-07-28 07:15:21

标签: java spring transactions annotations

如果我有一个事务管理类,我有两种方法,例如

void OuterMethod(Data somedata)
{
   this.InnerMethod(somedata)
}

@Transactional("mymanager")
void InnerMethod(Data somedata)
{
    //writes some things 
}

这是有效的吗?我出于某种原因无法写入数据库,虽然它没有给我任何错误。

2 个答案:

答案 0 :(得分:2)

  

Spring不使用字节码   用于实施AOP的仪器。所以   如果一种方法可以预测   代理对象调用其他方法   在同一个对象中,方面会   不适用于方法调用。   然而Spring允许应用   此方法的方面通过设置调用   exposeProxy为True并使用   AopContext。currentProxy()。

信息可能有点过时,但据我所知,它仍然准确(虽然不确定“exposeProxy”标志)

请参阅http://forum.springsource.org/showthread.php?t=9926

答案 1 :(得分:0)

这是一个棘手的话题。当Spring找到@Transactional注释时,它会使用基于JDK接口的代理或基于CGLIB子类的代理为您的对象创建代理。在这两种情况下,代理仅适用于公共方法。我可能过分简化了一些事情,但这是一般的想法。

因此,虽然仍然可以生成代理对象来处理带注释的InnerMethod(),但实际上它不会被调用,因为非公共方法将“崩溃”。如果Spring警告你这件事会很好,但事实并非如此。

简单的解决方案是确保您的注释适用于公共方法。