出错信息: 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无法得到上面的事物,
产生了以上错误... 请教高手如何把几个操作修改在一个事物中,然后再提交
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无法得到上面的事物,
产生了以上错误... 请教高手如何把几个操作修改在一个事物中,然后再提交
解决方案 »
- 求解一下struts2支持的ajax中的a标签问题,急求,在线等
- 请问学习java gis开发应该先学习什么基础知识?使用什么开发工具?
- 请问我怎样才能获得动态生成的行中的文本中的内容,我想获得动态生成每行的文本框的内容
- 谁能讲解下form-bean的调用过程
- 变量的问题,赋值
- 关于displayTag标签问题
- 郁闷,为什么session总丢失急急急!!!
- 我在servlet中用out.print(".....")输出html语句,但每当html中有border、align这些标记时,html就不能显示?
- <s:iterator>
- Struts2报There is no Action mapped for namespace / and action name usersAction_lo
- java 如何实现登录139邮箱 并判断是否登录成功?
- 如何将第三方jar文件打入jar文件
把这里所有的方法放入一个 spring service就可以了
Order与Product,多对多的关系..谁来救救俺,一经采用,俺会疯狂地给你加分..
2.用opsessionInview
3.在service层循环集合把延迟加载的属性取一遍
<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方法。
现在有个问题是在dao层怎么操作,比如之前的保存方法.
public void addCustomer(Customer customer) {
getHibernateTemplate().save(customer);
}
6楼Johnson_Hong老师在的话帮忙看一下...
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里面配过了,这个还要配置吗?
<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>
我是在上面的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)
这又是怎么一回事儿呢?
很明显,
Product的属性orders 需要配置成 lazy="false" 具体什么位置,看看你的Product的hbm文件。
<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>
别的没改,只是配置了下这个,还有没有配置的参数或是什么地方得改吗?
我用opensessioninview,但是没有反应.
还是报session关闭,26楼是配置中的web.xml文件.
第一种:在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>