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 为什么在控制器或服务中,我们可以访问延迟加载的代理对象,但不能访问AbstractUserDetailsAuthenticationProvider的子类?_Java_Hibernate_Spring Boot_Spring Transactions - Fatal编程技术网

Java 为什么在控制器或服务中,我们可以访问延迟加载的代理对象,但不能访问AbstractUserDetailsAuthenticationProvider的子类?

Java 为什么在控制器或服务中,我们可以访问延迟加载的代理对象,但不能访问AbstractUserDetailsAuthenticationProvider的子类?,java,hibernate,spring-boot,spring-transactions,Java,Hibernate,Spring Boot,Spring Transactions,我问了这个问题,但它是封闭的,我还没有得到确切的答案; 我读到了这个答案; 他们谈到了内部方法调用和外部方法调用。但这适用于任何控制器或服务。为什么不在注释为@Component的provider类中?为什么Spring或Hibernate即使使用@Transactional注释也不能在提供程序类中打开会话?这是关于春季安全的吗?有什么不同吗?请仔细阅读参考资料 以下图像显示了在上调用方法的概念视图 事务代理: 现在有了这些信息,一个用@Transactional注释的方法只有在通过具有该

我问了这个问题,但它是封闭的,我还没有得到确切的答案;

我读到了这个答案;


他们谈到了内部方法调用和外部方法调用。但这适用于任何控制器或服务。为什么不在注释为@Component的provider类中?为什么Spring或Hibernate即使使用@Transactional注释也不能在提供程序类中打开会话?这是关于春季安全的吗?有什么不同吗?

请仔细阅读参考资料

以下图像显示了在上调用方法的概念视图 事务代理:

现在有了这些信息,一个用
@Transactional
注释的方法只有在通过具有该注释方法的类的代理对象调用该方法时才会启动事务。专家们在上一个问题中将此电话称为外部电话

以你为例,

抽象方法的实现是从调用的,这是一种自调用。这就是专家们所说的内部通话。还要注意,方法
authenticate()
不是
@事务性的

浏览本节下的文档

在代理模式(默认)下,只有外部方法调用 通过代理进入被拦截。这意味着 自调用(实际上是目标对象中的一个方法调用 目标对象的另一种方法)不会导致实际的 即使调用的方法标记为 @事务性的。此外,代理必须完全初始化以提供 预期的行为,因此您不应在应用程序中依赖此功能 初始化代码(即@PostConstruct)

在使用
@Component
注释的提供程序类中,对代理的调用到达一个未使用
@Transactional
注释的方法,并对使用
@Transactional
注释的方法执行自调用或内部调用,这与前面解释的不起作用

对于控制器或服务,首先调用带有
@Transactional
注释的方法(外部调用),该方法启动事务。该方法上下文中的代码流位于一个事务中,并且所有后续方法都参与该事务,并且您没有看到
-无会话
异常

希望这有帮助