Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate 延迟加载错误_Hibernate_Transactions_Jakarta Ee_Spring Mvc_Lazy Loading - Fatal编程技术网

Hibernate 延迟加载错误

Hibernate 延迟加载错误,hibernate,transactions,jakarta-ee,spring-mvc,lazy-loading,Hibernate,Transactions,Jakarta Ee,Spring Mvc,Lazy Loading,我知道这个问题已经在这里提过好几次了。然而,我找不到任何有帮助的解决方案,所以我决定再次发布 我将Hibernate与Spring MVC框架结合使用,并尝试使用子类获取我的类: public class Scene implements Serializable{ private Long id; private Author author; //omitting getters and setters } public class Author{ private Long id; Pri

我知道这个问题已经在这里提过好几次了。然而,我找不到任何有帮助的解决方案,所以我决定再次发布

我将Hibernate与Spring MVC框架结合使用,并尝试使用子类获取我的类:

public class Scene implements Serializable{
private Long id;
private Author author;
//omitting getters and setters
} 

public class Author{
private Long id;
Private String  name; 
//omitting getters and setters
}
我的Hibernate配置如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="org.postgresql.Driver" />
  <property name="url" value="jdbc:postgresql://127.0.0.1/doolloop2" />
  <property name="username" value="doolloop2" />
  <property name="password" value="doolloop" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
     <property name="mappingLocations">
      <list>
        <value>WEB-INF/mapping/Scene.hbm.xml</value>
        <value>WEB-INF/mapping/Author.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
 <props>
  <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
  <prop key="hibernate.show_sql">true</prop> 
  <prop key="hibernate.hbm2ddl.auto">update</prop> 
  <prop key="hibernate.cache.use_second_level_cache">true</prop> 
  <prop key="hibernate.cache.use_query_cache">true</prop> 
  <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
  </props>
  </property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="txService" class="com.doolloop.services.TxDataBaseServiceImpl">
        <property name="sessionFactory">
        <ref local="sessionFactory"/>
        </property>
    </bean> 
还有我的spring mvc代码:

 @RequestMapping(value="/getSceneMetaData.dlp",method = RequestMethod.GET)
     @ResponseBody
     public Scene getSceneMetaData(@RequestParam String id){
        Scene scene = service.getScene(Long.parseLong(id));
        return scene;
    }
当我执行它时,我得到以下异常:

Dec 5, 2010 12:29:21 PM org.hibernate.LazyInitializationException <init>
    SEVERE: failed to lazily initialize a collection of role: com.doolloop.objects.Scene.author, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.doolloop.objects.Scene.vauthor, no session or session was closed
org.codehaus.jackson.map.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.doolloop.objects.Scene["author"]->com.doolloop.objects.Author_$$_javassist_4["name"])
更新3:

这是此操作的log4j输出:

2010-12-06 11:48:09,031 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] - Using SessionFactory 'sessionFactory' for OpenSessionInViewFilter
2010-12-06 11:48:09,036 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'sessionFactory'
2010-12-06 11:48:09,040 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] - Opening single Hibernate Session in OpenSessionInViewFilter
2010-12-06 11:48:09,042 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] - Opening Hibernate Session
2010-12-06 11:48:09,048 DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'doolloop' processing GET request for [/dlp/getSceneMetaData.dlp]
2010-12-06 11:48:09,056 DEBUG [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapping [/getSceneMetaData.dlp] to HandlerExecutionChain with handler [com.doolloop.controllers.SceneController@21c33b55] and 2 interceptors
2010-12-06 11:48:09,060 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Last-Modified value for [/dlp/getSceneMetaData.dlp] is: -1
2010-12-06 11:48:09,142 DEBUG [org.springframework.core.convert.support.GenericConversionService] - Converting value '140' of [TypeDescriptor java.lang.String] to [TypeDescriptor @org.springframework.web.bind.annotation.RequestParam java.lang.String]
2010-12-06 11:48:09,146 DEBUG [org.springframework.core.convert.support.GenericConversionService] - Converted to '140'
2010-12-06 11:48:09,148 DEBUG [org.springframework.web.bind.annotation.support.HandlerMethodInvoker] - Invoking request handler method: public com.doolloop.objects.Scene com.doolloop.controllers.SceneController.getSceneMetaData(java.lang.String)
2010-12-06 11:48:16,401 DEBUG [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver] - Resolving exception from handler [com.doolloop.controllers.SceneController@21c33b55]: org.codehaus.jackson.map.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.doolloop.objects.Scene["author"]->com.doolloop.objects.Author_$$_javassist_4["name"])
2010-12-06 11:48:16,561 DEBUG [org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver] - Resolving exception from handler [com.doolloop.controllers.SceneController@21c33b55]: org.codehaus.jackson.map.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.doolloop.objects.Scene["author"]->com.doolloop.objects.Author_$$_javassist_4["name"])
2010-12-06 11:48:16,568 DEBUG [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] - Resolving exception from handler [com.doolloop.controllers.SceneController@21c33b55]: org.codehaus.jackson.map.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.doolloop.objects.Scene["author"]->com.doolloop.objects.Author_$$_javassist_4["name"])
2010-12-06 11:48:16,572 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.codehaus.jackson.map.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.doolloop.objects.Scene["author"]->com.doolloop.objects.Author_$$_javassist_4["name"])
    at org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:215)

//// Entire stack trace goes here.

2010-12-06 11:48:16,660 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] - Closing single Hibernate Session in OpenSessionInViewFilter
2010-12-06 11:48:16,662 DEBUG [org.springframework.orm.hibernate3.SessionFactoryUtils] - Closing Hibernate Session
更新4:

我只看到一个select n控制台:

Hibernate: select scene0_.Id as Id20_0_, scene0_.name as name20_0_, scene0_.description as descript3_20_0_, scene0_.defaultView as defaultV4_20_0_, scene0_.authorid as authorid20_0_ from scene scene0_ where scene0_.Id=?
但是,如果这样修改getScene方法:

 public Scene getScene(Long id) {
        Session session = this.sessionFactory.getCurrentSession();
        Query q = session.createQuery("select scene from com.doolloop.objects.Scene scene where scene.id=:id");
        q.setLong("id", id);
        Scene scene = (Scene)q.uniqueResult()
        **Author author = scene.getAuthor();**
        return scene; 
我将看到出现第二个选择:

Hibernate: select author0_.Id as Id23_0_, author0_.name as name23_0_, author0_.email as email23_0_, author0_.site as site23_0_, author0_.contactInfo as contactI5_23_0_ from authors author0_ where author0_.Id=?
但是author对象仍然是空的


从控制器调用同一个getter会导致异常。

可能值得先发布Scene.hbm.xml和Author.hbm.xml

我在这里看到: 默认情况下,如果使用注释,多对一关系会被急切地加载,但是如果使用XML映射,则不会发生这种情况

我建议修改多对一关系并显式设置
fetch=“EAGER”

因此,结果应该是:

<many-to-one
     name="author"
     class="com.doolloop.objects.Author"
     cascade="all"
     column="authorid"
     unique="false"
     fetch="EAGER"
 />  

您提到过有两种使用场景:一种是获取场景对象并需要其所有依赖项,另一种是只对id和它的几个字段感兴趣。这似乎是定义Hibernate会话边界的问题。您可以使用这里描述的SessionInViewFilter:这样,Hibernate会话将在http请求期间打开,因此您将能够访问延迟加载的引用,直到渲染时间。这有用吗

====================================================
我看过你的OpenSessionInViewFilter定义-可能值得明确设置你的HibernateSessionFactory的名称:

<filter>
   <filter-name>openSessionInViewFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
     </init-param>
 </filter>

openSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
sessionFactoryBeanName
会话工厂
另外,我在Spring配置中没有看到Tx管理器的正确初始化。仅仅定义它是不够的,您需要:

<tx:annotation-driven transaction-manager="transactionManager"/>

====================================================
从我在Hibernate文档中看到的情况来看,一旦关闭事务,Hibernate会话很可能会结束(即使使用OpenSessionInView过滤器)。 请看这里:

关闭事务后,db连接将返回到池中,所有对db的进一步访问都需要一个新连接,该连接应启用自动提交模式


但是,在您的情况下,我认为解决方案应该是确保在事务仍然打开的情况下,您已经从DB加载了所有需要加载的内容

可能值得先发布Scene.hbm.xml和Author.hbm.xml

我在这里看到: 默认情况下,如果使用注释,多对一关系会被急切地加载,但是如果使用XML映射,则不会发生这种情况

我建议修改多对一关系并显式设置
fetch=“EAGER”

因此,结果应该是:

<many-to-one
     name="author"
     class="com.doolloop.objects.Author"
     cascade="all"
     column="authorid"
     unique="false"
     fetch="EAGER"
 />  

您提到过有两种使用场景:一种是获取场景对象并需要其所有依赖项,另一种是只对id和它的几个字段感兴趣。这似乎是定义Hibernate会话边界的问题。您可以使用这里描述的SessionInViewFilter:这样,Hibernate会话将在http请求期间打开,因此您将能够访问延迟加载的引用,直到渲染时间。这有用吗

====================================================
我看过你的OpenSessionInViewFilter定义-可能值得明确设置你的HibernateSessionFactory的名称:

<filter>
   <filter-name>openSessionInViewFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
     </init-param>
 </filter>

openSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
sessionFactoryBeanName
会话工厂
另外,我在Spring配置中没有看到Tx管理器的正确初始化。仅仅定义它是不够的,您需要:

<tx:annotation-driven transaction-manager="transactionManager"/>

====================================================
从我在Hibernate文档中看到的情况来看,一旦关闭事务,Hibernate会话很可能会结束(即使使用OpenSessionInView过滤器)。 请看这里:

关闭事务后,db连接将返回到池中,所有对db的进一步访问都需要一个新连接,该连接应启用自动提交模式


但是,在您的情况下,我认为解决方案应该是确保在事务仍然打开的情况下,您已经从DB加载了所有需要加载的内容

完成,但我认为问题不在那里,问题在我处理交易的方式上,但无论如何,提前谢谢你。首先感谢你的回复,我之前不知道。但是,我想让它保持惰性,因为我有两种情况,一种是在检索场景时,我需要所有项目;另一种是在搜索时,我只需要场景对象的ID、名称和描述。不幸的是,它没有帮助:(因此,您使用的是OpenSessionInViewFilter,您已经正确配置了TxManager,但仍然存在此问题。。您正在处理的数据是在该特定请求期间获取的还是从http会话获取的。换句话说,您确定您使用的对象仍然连接到Hibernate会话吗?我认为是的。please查看了这个操作的log4j。在我的更新3中。完成了,但我不认为问题在那里,问题在我处理事务的方式上,但无论如何,提前感谢你。首先感谢你的回复,我之前不知道。但是,我想让它保持懒惰,因为我有两个案例,一个是在检索场景和我需要所有的项目和第二,当我搜索,我只需要那里的ID,名称和场景对象的描述