用SSh框架整合时。在DAO中掉用getHibernateTemplate().save(transientInstance);时就会说Session已经关闭或者时不存在Session。 这是什么原因?是因为导包有冲突吗?DAO代码是:public class OrdersDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(OrdersDAO.class); protected void initDao() {
// do nothing
} public void save(Orders transientInstance) {
log.debug("saving Orders instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void save1(Orderlineitem transientInstance) {
log.debug("saving Orderlineitem instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public Orders findById(int id) {
log.debug("getting Orders instance with id: " + id);
try {
         //  Session session=this.getSession();

//       Orders instance = (Orders)session.get(
// Orders.class, id);
Orders instance=(Orders)getHibernateTemplate().get(Orders.class, id); if(instance==null){
System.out.println("数据库里没有此数据!");
}else{
    instance.getOrderlineitems().size();
     System.out.println(instance.getOrderlineitems().size());
}
// session.close();
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public static OrdersDAO getFromApplicationContext(ApplicationContext ctx) {
return (OrdersDAO) ctx.getBean("OrdersDAO");
}
}
抛得异常是:javax.servlet.ServletException: failed to lazily initialize a collection of role: com.order.bean.Orders.orderlineitems, no session or session was closed
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
       com.order.bean.Orders.orderlineitems, no session or session was closed org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
org.hibernate.collection.PersistentSet.size(PersistentSet.java:114)
com.order.bean.OrdersDAO.findById(OrdersDAO.java:47)
com.order.action.OrderItemAction.execute(OrderItemAction.java:40)
org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
在红色那报的异常。  不知道为什么。老师说是因为是Spring的asm-2.2.3.jar和Struts的asm.jar冲突了。可是我试了试还是不对 要是自己定义一个Session就可以用。也不回报错。郁闷中    大家帮帮

解决方案 »

  1.   

    因为getHibernateTemplate()是基于事务级别的,在它里面封装了一次事务的开启,操作,关闭。所以你在条用完它之后,它就自动关闭了,因此就没有了session了,我之前也遇到过这样的问题。你在里面配置基于线程的看行不了?在Hibernate的配置文件里加上:
    <property name="hibernate.current_session_context_class">thread</property>
      

  2.   

    只有一个可能,你在事务外面调用了lazy的,没有初始化的对象。解决方法
    1 lazy="false"
    2 使用前,事务里面调用一次你的这个属性
    3 修改你的设计
      

  3.   

    因为我是Spring Hibernate整合的所以我就在Spring的配置中添加了那个属性,但是还是不行。
    那会你就是这样解决错误的?  
      

  4.   

    用super.getSession()来操作数据吧