Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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_Spring_Transactions_Annotations - Fatal编程技术网

Java Spring事务管理-将注释放置在何处?

Java Spring事务管理-将注释放置在何处?,java,spring,transactions,annotations,Java,Spring,Transactions,Annotations,如果我有一个事务管理类,其中我有两个方法,例如 void OuterMethod(Data somedata) { this.InnerMethod(somedata) } @Transactional("mymanager") void InnerMethod(Data somedata) { //writes some things } 这有效吗?由于某种原因,我无法让它写入数据库,尽管它不会给我任何错误 Spring不使用字节码 实现AOP的工具。所以 可以预见,如果

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

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

@Transactional("mymanager")
void InnerMethod(Data somedata)
{
    //writes some things 
}
这有效吗?由于某种原因,我无法让它写入数据库,尽管它不会给我任何错误

Spring不使用字节码 实现AOP的工具。所以 可以预见,如果 代理对象调用另一个方法 在同一对象中,方面将 不能应用于方法调用。 然而,Spring允许应用 通过设置调用此方法的方面 exposeProxy为True并使用 .currentProxy()

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


参见

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

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


简单的解决方案是确保注释位于公共方法上。

对不起,我对Java或Spring了解不多。你介意澄清一下吗?这是否意味着我应该只注释OuterMethod?是的,这就是它的本质。问题在于事务处理位于不同的对象中。因此,您调用proxy.OuterMethod()->service.OuterMethod()->service.InnerMethod(),所有事务处理都在proxy.InnerMethod()中,这是无法从service.OuterMethod()访问的。如果不使用AopContext.currentProxy(),这将是一个非常糟糕的解决方法。所以是的,注释OuterMethod()或者两者都可以。没错。代理的替代方法是使用AspectJ AOP,或者通过加载时编织(丑陋,必须替换类加载器)或者编译时编织(使构建过程复杂化,但是Eclipse和Maven提供了良好的工具支持)。注意:按照惯例,Java中的方法名以小写字符开头(即outerMethod(),innerMethod()