出错信息: Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: wind.rose.crm.entity.Product.orders, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:411)
    at wind.rose.crm.entity.Product.hashCode(Product.java:74)
    at java.util.HashMap.put(HashMap.java:372)
    at java.util.HashSet.add(HashSet.java:200)
    at test.Test.main(Test.java:43)test.javapackage test;
import wind.rose.crm.entity.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import wind.rose.crm.customer.service.CustomerService;
import wind.rose.crm.customer.service.OrderService;
import wind.rose.crm.customer.service.ProductService;
import wind.rose.crm.customer.service.UserService;
import wind.rose.crm.entity.Customer;
import wind.rose.crm.entity.User;
import java.util.*;
public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        OrderService orderService = (OrderService) ac.getBean("orderService");
        Product p1 = orderService.findByProductName("p1");
        Product p2 = orderService.findByProductName("p2");
        Product p3 = orderService.findByProductName("p3");
        
        Order order1 = new Order();
        Customer c1 = orderService.findCustomerByName("mm1");
        order1.setCustomer(c1);
        
        Order order2 = new Order();
        Customer c2 = orderService.findCustomerByName("mm2");
        order2.setCustomer(c2);
        
        Order order3 = new Order();
        Customer c3 = orderService.findCustomerByName("mm3");
        order3.setCustomer(c3);
        
        order1.getProducts().add(p1);
        order1.getProducts().add(p2);
        order1.getProducts().add(p3);
        
        order2.getProducts().add(p1);
        order2.getProducts().add(p2);
        order2.getProducts().add(p3);
        
        order3.getProducts().add(p1);
        order3.getProducts().add(p2);
        order3.getProducts().add(p3);
        
        p1.getOrders().add(order1);
        p1.getOrders().add(order2);
        p1.getOrders().add(order3);
        
        p2.getOrders().add(order1);
        p2.getOrders().add(order2);
        p2.getOrders().add(order3);
        
        p3.getOrders().add(order1);
        p3.getOrders().add(order2);
        p3.getOrders().add(order3);
        
        orderService.addOrder(order1);
        orderService.addOrder(order2);
        orderService.addOrder(order3);
    }
}我想是这样的,orderService进行了findCustomerByName,findByProductName,addOrder的操作. 
这几个操作中,我在service 的方法里面用spring标注事物的形式@Transactional(propagation=Propagation.REQUIRED) 
几个方法都是如此设定的... 可能是在起初的findCustomerByName完成之后,事物就提交了,后面的findByProductName无法得到上面的事物, 
产生了以上错误... 请教高手如何把几个操作修改在一个事物中,然后再提交

解决方案 »

  1.   

    >_< 发那么多贴..
    把这里所有的方法放入一个 spring service就可以了
      

  2.   

    貌似分少了莫人....会给你加分...那么多重复的回复();有没有不放一个service里的方法啊...
      

  3.   

    发现不能放在一个service的方法里面
      

  4.   

    补充,我是用spring+strust+hibernate
    Order与Product,多对多的关系..谁来救救俺,一经采用,俺会疯狂地给你加分..
      

  5.   

    1.service层把构成一个完整逻辑的操作写成一个方法。
    2.用opsessionInview
    3.在service层循环集合把延迟加载的属性取一遍
      

  6.   

    >_< 那不要给我分了...
      

  7.   

        <!-- 配置sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory"/>
    </property>
    </bean>
     <!-- 配置事务特性 -->       
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
         <tx:method name="*" propagation="REQUIRED"/>
         <!--  
         <tx:method name="add*" propagation="REQUIRED"/>
         <tx:method name="del*" propagation="REQUIRED"/>
         <tx:method name="update*" propagation="REQUIRED"/>
         <tx:method name="deploy*" propagation="REQUIRED"/>
         <tx:method name="submit*" propagation="REQUIRED"/>
         <tx:method name="*" read-only="true"/>
         -->
         </tx:attributes>
        </tx:advice>请显示调用save方法。
      

  8.   

    最简单的办法,这一段代码直接用jdbc做,那样事务最好控制了
      

  9.   

    这一段时间我在看opensessionInview,关于在spring中添加的配置信息都弄好了..
    现在有个问题是在dao层怎么操作,比如之前的保存方法.
    public void addCustomer(Customer customer) {
    getHibernateTemplate().save(customer);
    }
    6楼Johnson_Hong老师在的话帮忙看一下...
      

  10.   

    解一:在你的Hibenater里面的XML中,把CLASS中都加入lazy="false"延迟加载,是可以的哦!解二:你应该在DAO层,每个方法里都有写session.close();将这个方法换成session.flush();
      

  11.   

    applicationContext.xml加了openSessionInViewInterceptor出错:log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
    log4j:WARN Please initialize the log4j system properly.
    Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Error 'Unexpected failure during bean definition parsing' in resource 'class path resource [applicationContext.xml]' at:
    Bean 'urlMapping'; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Error '<property> element for property 'mapping' must specify a ref or value' in resource 'class path resource [applicationContext.xml]' at:
    Bean 'urlMapping'
    -> Property 'mapping'
    Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Error '<property> element for property 'mapping' must specify a ref or value' in resource 'class path resource [applicationContext.xml]' at:
    Bean 'urlMapping'
    -> Property 'mapping'
    at org.springframework.beans.factory.xml.FailFastProblemReporter.error(FailFastProblemReporter.java:46)
    at org.springframework.beans.factory.support.ReaderContext.error(ReaderContext.java:69)
    at org.springframework.beans.factory.support.ReaderContext.error(ReaderContext.java:64)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.error(XmlBeanDefinitionParserHelper.java:1113)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.parsePropertyValue(XmlBeanDefinitionParserHelper.java:769)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.parsePropertyElement(XmlBeanDefinitionParserHelper.java:705)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.parsePropertyElements(XmlBeanDefinitionParserHelper.java:589)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.parseBeanDefinitionElement(XmlBeanDefinitionParserHelper.java:409)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionParserHelper.parseBeanDefinitionElement(XmlBeanDefinitionParserHelper.java:373)
    at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseDefaultElement(DefaultXmlBeanDefinitionParser.java:162)
    at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinitions(DefaultXmlBeanDefinitionParser.java:143)
    at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.registerBeanDefinitions(DefaultXmlBeanDefinitionParser.java:87)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:509)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:353)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:277)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:129)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:145)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:171)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:116)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:82)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:89)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:279)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)
    at test.Test.main(Test.java:24)
    <bean name="openSessionInViewInterceptor"
    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
    <property name="sessionFactory">
    <ref bean="mySessionFactory" />
    </property>
    </bean>
    <bean id="urlMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
    <list>
    <ref bean="openSessionInViewInterceptor" />
    </list>
    </property>
    <property name="mapping">
    </property>
    </bean><property name="mapping">据说是.hbm.xml的路径,我在mySessionFactory里面配过了,这个还要配置吗?
      

  12.   

    这个地方是url映射的配置,例如
    <prop key="/*.do">strutsWrappingController</prop>更常见的是用另外一种方式在web.xml里配置
    <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    </filter>
            <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*.do</url-pattern>
    </filter-mapping>
      

  13.   

    可是我在web.xml里面配置的话,不起作用啊,还是no session.
    我是在上面的test文件里面测试的,
    后来我看一下日志,开始有这样的错误:14:42:06,281 DEBUG SessionFactoryObjectFactory:39 - initializing class SessionFactoryObjectFactory
    14:42:06,296 DEBUG SessionFactoryObjectFactory:76 - registered: 4028814820321087012032108b2a0000 (unnamed)
    14:42:06,296  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
    14:42:06,296 DEBUG SessionFactoryImpl:308 - instantiated session factory
    14:42:06,437 ERROR SessionFactoryImpl:1007 - Unable to construct current session context [2]
    java.lang.ClassNotFoundException: 2
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
    at org.hibernate.impl.SessionFactoryImpl.buildCurrentSessionContext(SessionFactoryImpl.java:1001)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:334)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:871)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:797)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:877)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:846)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:419)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:241)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:152)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:219)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:115)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:781)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:572)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:415)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:241)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:152)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:219)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:115)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:781)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:572)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:415)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBeanDefinition(BeanDefinitionValueResolver.java:168)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:111)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:781)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:572)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:415)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:241)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:152)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:129)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.setBeanFactory(AbstractAdvisorAutoProxyCreator.java:61)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:839)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:419)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:241)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:152)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:199)
    at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:661)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:425)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:316)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)
    at test.Test.main(Test.java:24)
    这又是怎么一回事儿呢?
      

  14.   

    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: wind.rose.crm.entity.Product.orders
    很明显,
    Product的属性orders 需要配置成 lazy="false" 具体什么位置,看看你的Product的hbm文件。
      

  15.   

    这个是你的延迟加载的问题,你要加载的关联关系的时候session被关闭了 你把lazy="false"就可以了
      

  16.   

    不能用lazy=false解决,否则出现另外的错误.我想知道opensessioninview的时候为什么不行,是不是我哪里配置不对,还是不能在test文件中测试,只能在action中在web.xml中的配置:
    <filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    <!--  singleSession默认为true,若设为false则等于没用OpenSessionInView  -->
    <init-param>
    <param-name>singleSession</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>
    别的没改,只是配置了下这个,还有没有配置的参数或是什么地方得改吗?
      

  17.   

    在ssh框架下,懒加载的问题引起的session关闭,不能用lazy=false,否则会引起其它问题
    我用opensessioninview,但是没有反应.
    还是报session关闭,26楼是配置中的web.xml文件.
      

  18.   

    用完session后关闭,或者使用flush也可以
      

  19.   

    如果在后台进行测试的话,最好手工把lazy修改成false真正用在web环境中的时候,把lazy改成true,然后配置openSessionInViewfilter
      

  20.   

    配置信息:
    第一种:在web.xml中: <filter>
      <filter-name>hibernateFilter</filter-name>
      <filter-class>
       org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
      </filter-class>
      <!-- 如果默认为sessionFactory,可以去掉此处 -->
      <init-param>
       <param-name>sessionFactoryBeanName</param-name>
       <param-value>mySessionFactory</param-value>
      </init-param>
     </filter>
     <filter-mapping>
      <filter-name>hibernateFilter</filter-name>
      <url-pattern>*.do</url-pattern>
     </filter-mapping> 在struts和spring整合在web.xml用以下方式,来避免spring两次初始化,避免得到不同的session  <listener>
      <listener-class>
       org.springframework.web.context.ContextLoaderListener
      </listener-class>
     </listener>
     <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
       /WEB-INF/spring-config/applicationContext.xml
      </param-value>
     </context-param>第二种在applicationContext.xml里面: <bean name="openSessionInViewInterceptor"
      class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
      <property name="sessionFactory">
       <ref bean="mySessionFactory" />
      </property>
     </bean>
     
     <bean id="urlMapping"
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
      <property name="interceptors">
       <list>
        <ref bean="openSessionInViewInterceptor" />
       </list>
      </property>
      <property name="mappings">
       <props>
        <prop key="/addOrder.do">OrderAction</prop>
       </props>
      </property>
     </bean>