Java 弹簧靴。尝试打印非存储实体时没有代理

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

从一个常规的Spring Boot项目开始,我有一个实体:

@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);
   }
}