Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 延迟获取中的Weired会话错误_Java_Hibernate_Spring_Transactions - Fatal编程技术网

Java 延迟获取中的Weired会话错误

Java 延迟获取中的Weired会话错误,java,hibernate,spring,transactions,Java,Hibernate,Spring,Transactions,错误是未能延迟初始化集合,没有会话或会话已关闭 有很多人问了几乎相同的问题,但解决方案并不是那么直观。而且,我认为有必要发布另一个问题来描述奇怪的错误消息: (我不打算在这里粘贴源代码,因为它太长了。) 实体可能与会话分离,而延迟加载集合只是一个代理?如果要使用它,需要将其合并到会话中?该线程绑定了一个会话,但catList是否由该会话管理?会话可能是由负责样板代码的hibernate模板在dao.list()中关闭的 解决问题的一种方法是在返回列表之前在dao.list()函数中调用list.

错误是
未能延迟初始化集合,没有会话或会话已关闭

有很多人问了几乎相同的问题,但解决方案并不是那么直观。而且,我认为有必要发布另一个问题来描述奇怪的错误消息:

(我不打算在这里粘贴源代码,因为它太长了。)


实体可能与会话分离,而延迟加载集合只是一个代理?如果要使用它,需要将其合并到会话中?

该线程绑定了一个会话,但catList是否由该会话管理?会话可能是由负责样板代码的hibernate模板在dao.list()中关闭的

解决问题的一种方法是在返回列表之前在dao.list()函数中调用list.get(0).someGetter()。这将用实际值填充列表,并且不会导致延迟初始化异常。如果Cat由更多的延迟初始化对象组成,那么您也应该对它们调用getter属性,以防您想要使用这些属性


此外,如果有,请尝试删除dao.list()方法上的任何事务性注释。使用调用函数创建的事务,而不是使用Propagation_Required属性。如果您在dao.list()上使用了@Transactional,则从该函数返回时,事务管理器可能会触发一个transaction.commit()/session.close(),因此catList成为一个分离的实体,其中所有CAT仍然是代理。

这意味着您正试图从会话中加载/初始化集合。可能在完成操作之前,您必须保持会话处于活动状态。。。。。这意味着你必须使用一些胶水代码来管理你的会话资源。。。ppl建议在实体的set方法中初始化惰性集合。像使用急切获取一样使用延迟获取是没有意义的。在操作之前保持会话活动可能是最好的方法……

您是否在JUnit测试用例中运行此操作?合并是一个代价高昂的操作
DEBUG [main] (AbstractPlatformTransactionManager.java:365) - Creating new transaction with name [com.bee32.plover.orm.feaCat.FeaturePlayer.tcList]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
DEBUG [main] (HibernateTransactionManager.java:493) - Opened new Session [org.hibernate.impl.SessionImpl@19006c9] for Hibernate transaction
DEBUG [main] (HibernateTransactionManager.java:523) - Not preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@19006c9]
DEBUG [main] (HibernateTemplate.java:397) - Found thread-bound Session for HibernateTemplate
Hibernate:    /* criteria query */ select 
    ...

ERROR [main] (LazyInitializationException.java:42) - failed to lazily initialize a collection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
  at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    ...
  at java.util.HashSet.<init>(HashSet.java:116)
    ...
  at org.hibernate.loader.Loader.list(Loader.java:2124)
    ...
  at org.springframework.orm.hibernate3.HibernateTemplate$5.doInHibernate(HibernateTemplate.java:590)
  ...

DEBUG [main] (HibernateTemplate.java:422) - Not closing pre-bound Hibernate Session after HibernateTemplate
DEBUG [main] (AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback
DEBUG [main] (HibernateTransactionManager.java:672) - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@19006c9]
DEBUG [main] (HibernateTransactionManager.java:734) - Closing Hibernate Session [org.hibernate.impl.SessionImpl@19006c9] after transaction
@Transactional
public void tcList() {
    for (Cat cat : dao.list()) {
        System.out.println("Saved cat: " + cat);
    }
}