Java 弹簧靴。尝试打印非存储实体时没有代理
从一个常规的Spring Boot项目开始,我有一个实体:Java 弹簧靴。尝试打印非存储实体时没有代理,java,spring,spring-boot,jpa,spring-data,Java,Spring,Spring Boot,Jpa,Spring Data,从一个常规的Spring Boot项目开始,我有一个实体: @Entity public class Job { @Id @GeneratedValue private long id; @ManyToOne(fetch = EAGER) @JoinColumn private Config config; ... } toString()通常由Eclipse生成,以完成字段的常规打印。 当我尝试对工作流进行基本模拟并执行以下操作时: @Service publ
@Entity
public class Job {
@Id
@GeneratedValue
private long id;
@ManyToOne(fetch = EAGER)
@JoinColumn
private Config config;
...
}
toString()通常由Eclipse生成,以完成字段的常规打印。
当我尝试对工作流进行基本模拟并执行以下操作时:
@Service
public class TestService {
private static final Logger logger = LoggerFactory.getLogger("test");
@Transactional
public void addJob(Job job) {
logger.info("Adding job {}", job);
}
...
}
@Service
public class Tests {
@Autowired
private TestService service;
@Autowired
private ConfigDao configDao;
@EventListener(ApplicationReadyEvent.class)
public void testJobAdd() {
Job job = new Job();
job.setConfig(configDao.findAll().get(0));
service.addJob(job);
}
}
这为Job实体的@manytone元素提供了一个“No session”异常
我确实明白,这远远不是通常的做事方式,但我仍然想知道为什么会出现这种例外情况。“配置”是在pojo创建时交付的,因此甚至不应该发生“获取”
我可以先存储对象,然后返回一个完全缓存的实体,这将起作用,但我希望在对象到达JPA之前记录作业详细信息
堆栈:
019-04-16 15:07:52 ERROR [localhost-startStop-1] SpringApplication.reportFailure: Application run failed
org.hibernate.LazyInitializationException: could not initialize proxy [org.applebase.AutomationAgent.entity.sessionConfig.SessionConfig#1403] - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:169)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:309)
at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45)
at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)
at org.applebase.AutomationAgent.entity.sessionConfig.SessionConfig$HibernateProxy$GOSm9GNJ.getName(Unknown Source)
at org.applebase.AutomationAgent.service.impl.JobServiceImpl.save(JobServiceImpl.java:28)
at org.applebase.AutomationAgent.service.impl.JobServiceImpl$$FastClassBySpringCGLIB$$13b2fdc0.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at org.applebase.AutomationAgent.service.impl.JobServiceImpl$$EnhancerBySpringCGLIB$$ae28e0fc.save(<generated>)
at org.applebase.AutomationAgent.service.impl.SomeTestService.formingAJob(SomeTestService.java:58)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:261)
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:179)
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:142)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:105)
at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:78)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:332)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1420)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1410)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.base/java.lang.Thread.run(Thread.java:844)
019-04-16 15:07:52错误[localhost-startStop-1]SpringApplication.reportFailure:应用程序运行失败
org.hibernate.LazyInitializationException:无法初始化代理[org.applebase.AutomationAgent.entity.sessionConfig.sessionConfig#1403]-无会话
位于org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:169)
位于org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:309)
位于org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45)
位于org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)
位于org.applebase.AutomationAgent.entity.sessionConfig.sessionConfig$HibernateProxy$GOSm9GNJ.getName(未知源)
位于org.applebase.AutomationAgent.service.impl.JobServiceImpl.save(JobServiceImpl.java:28)
位于org.applebase.AutomationAgent.service.impl.JobServiceImpl$$FastClassBySpringCGLIB$$13b2fdc0.invoke()
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)上
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:294)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
在org.applebase.AutomationAgent.service.impl.JobServiceImpl$$EnhancerBySpringCGLIB$$ae28e0fc.save()上
位于org.applebase.AutomationAgent.service.impl.SomeTestService.formingAJob(SomeTestService.java:58)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:564)
位于org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:261)
位于org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:179)
位于org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:142)
位于org.springframework.context.event.SimpleApplicationEventMulticast.doInvokeListener(SimpleApplicationEventMulticast.java:172)
位于org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
位于org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
位于org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
位于org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
位于org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:105)
位于org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:78)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:332)
位于org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
位于org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
在org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup上(SpringBootServletInitializer.java:91)
在org.springframework.web.SpringServletContainerInitializer.onStartup上(SpringServletContainerInitializer.java:171)
位于org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
位于org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1420)
位于org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1410)
位于java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
位于java.base/java.lang.Thread.run(Thread.java:844)
您评论说,您的工作
实体中存在@XToMany
关系。由于所有人对多数人都是懒惰的
,因此会导致懒散的初始化异常
。这些字段不能在事务中实例化,因为它被传递给了用@Transact注释的方法
@Service
public class TestService {
@Autowired
private ConfigDao configDao;
private static final Logger logger = LoggerFactory.getLogger("test");
@Transactional
public void addJob() {
Job job = configDao.findAll().get(0);
logger.info("Adding job {}", job);
}
...
}
@Service
public class Tests {
@Autowired
private TestService service;
@EventListener(ApplicationReadyEvent.class)
public void testJobAdd() {
Job job = new Job();
job.setConfig();
service.addJob(job);
}
}