Java @事务在服务中的公共方法上工作,但不使用受保护的方法

Java @事务在服务中的公共方法上工作,但不使用受保护的方法,java,hibernate,spring-boot,jpa,transactional,Java,Hibernate,Spring Boot,Jpa,Transactional,我试图从同一服务impl类的另一个服务方法(a)调用一个服务方法(B)。现在,当我在A上加上@Transactional时,一切都正常,但当我在B上加上同样的东西时,一切都崩溃了。我得到的错误是 Exception: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: MyEntity.childs, could not initialize proxy - no

我试图从同一服务impl类的另一个服务方法(a)调用一个服务方法(B)。现在,当我在A上加上@Transactional时,一切都正常,但当我在B上加上同样的东西时,一切都崩溃了。我得到的错误是

Exception: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: MyEntity.childs, could not initialize proxy - no Session
        at <reference to my code>
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at <reference to my code>
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_162]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:223) ~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:483) ~[spring-cloud-context-2.0.0.RC1.jar:2.0.0.RC1]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) ~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
        at <reference to my code>
        at <reference to my code>
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590) ~[na:1.8.0_162]
        at <reference to my code>
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_162]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_162]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_162]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_162]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_162]
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: MyEntity.childs, could not initialize proxy - no Session
        at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:201) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
        at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
        at <reference to my code>
        ... 24 common frames omitted
异常:org.hibernate.LazyInitializationException:未能延迟初始化角色集合:MyEntity.childs,无法初始化代理-无会话
在
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
在org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
在
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_162]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.0\u 162]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0\u 162]
在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.0_162]
在org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:223)~[spring-core-5.0.5.RELEASE.jar:5.0.5.RELEASE]
在org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:483)~[spring-cloud-context-2.0.0.RC1.jar:2.0.0.RC1]
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:185)~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
在org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)~[spring-aop-5.0.5.RELEASE.jar:5.0.5.RELEASE]
在
在
在java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)~[na:1.8.0\u 162]
在
在java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)~[na:1.8.0\u 162]
在java.util.concurrent.FutureTask.run(FutureTask.java:266)~[na:1.8.0\u 162]
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)~[na:1.8.0_162]
在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)~[na:1.8.0_162]
在java.lang.Thread.run(Thread.java:748)~[na:1.8.0_162]
原因:org.hibernate.LazyInitializationException:未能延迟初始化角色集合:MyEntity.childs,无法初始化代理-无会话
在org.hibernate.collection.internal.AbstractPersistentCollection.ThrowlazyiInitializationException(AbstractPersistentCollection.java:582)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
在org.hibernate.collection.internal.AbstractPersistentCollection.WithTemporarySessionIneed(AbstractPersistentCollection.java:201)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
在org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
在org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
在org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
在
... 省略24个公共帧
我的类调用结构是这样的

A=失败案例
B=成功案例

doProcessS()==>public void
doSubProcessS()==>受保护的void

我使用的是SpringBoot 2.0.0.0版本


我希望以“A”方式而不是“B”方式执行所有操作,因为我希望根据doSubProcess()中提交给DB的数据在doProcessS()中执行另一个签入操作。
@Transactional
基于
Spring AOP

SpringAOP在自调用方法中不起作用(在同一类中)

您可以将
serviceinpl
中的
doProcessS()
标记为
@Transactional

这意味着对该对象引用的方法调用将被调用 代理,因此代理将能够委托给所有 与该特定方法相关的拦截器(通知) 呼叫但是,一旦调用最终到达目标对象, SimplePojo引用在本例中,任何方法调用 make本身,例如这个.bar()或这个.foo(),将 针对此引用而不是代理调用。这有 重要影响。这意味着自我调用不会发生 导致与方法调用关联的建议获得 执行的机会


如果要分离事务,请将
doSubProcessS
委托给其他类,并将其传播类型标记为
传播。需要\u NEW

感谢您的回复。但我之所以尝试这样做,是因为我希望在继续检查之前将一些数据提交给DB(刷新)。这对我来说是一种基线,在我进行检查之前,数据以DB的形式存在。如果您想分离您的事务,请将
doSubProcessS
委托给其他类,并将其传播类型标记为
传播。需要\u NEW
谢谢。请你分享一个参考链接来学习,因为我试图寻找它,但似乎有什么地方不对劲,因为他们没有给我正确的结果。另外,我还不熟悉Propagation.REQUIRES_new.Read more,我尝试过,但没有成功:(我面临的问题是,在场景A中,当它从doSubProcess()返回后,数据库没有更新,因此当我当时尝试执行新事务(其他MS中尝试从数据库读取最新数据的Read-invoke API)时,它只读取旧数据