Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 合并后休眠延迟加载错误_Java_Hibernate_Spring Mvc - Fatal编程技术网

Java 合并后休眠延迟加载错误

Java 合并后休眠延迟加载错误,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我正在使用vanilla Spring MVC和自定义FlashScope实现。我们基本上使用它来遵循Post-Redirect-Get模式 我遇到了一个奇怪的情况。在我的帖子中,我搜索了用户输入的参数,并将这些实例设置到FlashScope上。我看到那些部件工作得很好 在我放置到FlashScope上的对象中,我有一个延迟加载的集合,但是,当我尝试像这样访问该集合时: entity.getLazyLoadedCollection(); 我收到以下信息: ERROR org.hibernate

我正在使用vanilla Spring MVC和自定义FlashScope实现。我们基本上使用它来遵循Post-Redirect-Get模式

我遇到了一个奇怪的情况。在我的帖子中,我搜索了用户输入的参数,并将这些实例设置到FlashScope上。我看到那些部件工作得很好

在我放置到FlashScope上的对象中,我有一个延迟加载的集合,但是,当我尝试像这样访问该集合时:

entity.getLazyLoadedCollection();
我收到以下信息:

ERROR org.hibernate.LazyInitializationException IP127.0.0.1 CV#4c44559c-c576-4732 P#75004 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at core.model.entities.WorkflowState_$$_javassist_36.getFunctions(WorkflowState_$$_javassist_36.java)
奇怪的是,就在上面的调用之前,我将其合并到服务层的会话中:

getSession().merge(entity);
声明如果我知道我正在使用一个新会话,我应该调用update,但是这个命令使我看起来应该调用merge

作为解决方法,我已完成以下工作:

if (getSession().contains(entity)) {
    getHibernateTemplate().merge(person);
} else {
    getSession.update(entity);
}

我应该在这里做什么?

仔细阅读链接的javadoc:返回持久实例。如果给定实例未保存,请保存其副本并将其作为新的持久实例返回。给定实例不会与会话关联


无论您传递什么进行合并,该对象都不会与会话关联。您需要处理从merge返回的对象。

仔细阅读您链接的javadoc:返回持久实例。如果给定实例未保存,请保存其副本并将其作为新的持久实例返回。给定实例不会与会话关联


无论您传递什么进行合并,该对象都不会与会话关联。您需要使用从合并返回的对象。

从未使用过FlashScope,但您的错误可能是因为您试图访问一个尚未初始化的惰性集合,并且您的应用程序层中不再有访问Hibernate会话的权限。如果这个假设是正确的,那么您需要初始化可以访问会话的集合,例如DAO。以下是两种基本方法:

Hibernate.initialize(object.getMyLazyCollection());


从未使用过FlashScope,但您的错误可能是因为您试图访问一个尚未初始化的惰性集合,并且您不再位于可以访问Hibernate会话的应用程序层中。如果这个假设是正确的,那么您需要初始化可以访问会话的集合,例如DAO。以下是两种基本方法:

Hibernate.initialize(object.getMyLazyCollection());


最后一点让我高兴的是,我没有把它和会议联系起来。这名后卫看起来合适吗?还是应该完全是另外一回事?我不确定有什么好的答案。除了您发现的将对象关联到会话或不更新和合并的区别之外,完成的事情大致相同。我认为这可能只是一个什么语义更适合你的系统的问题。我高兴地看到最后一点,它没有与会话相关联。这名后卫看起来合适吗?还是应该完全是另外一回事?我不确定有什么好的答案。除了您发现的将对象关联到会话或不更新和合并的区别之外,完成的事情大致相同。我认为这可能只是一个什么在语义上更适合你的系统的问题。