spring+struts+hibernata
我有两个表 Cd_Student(1:n)CdClassStudent  key StudentId     CdStudent.hbm.xml
<set name="cdClassStudents" inverse="true" >
<key>
<column name="StudentId" />
</key>
<one-to-many class="czdiso.school.member.po.CdClassStudent" />
</set>     CdClassStudent.hbm.xml
<many-to-one name="cdStudent" class="czdiso.school.member.po.CdStudent" fetch="select">
            <column name="StudentId" />
        </many-to-one>执行以下代码
StudentService studentdo = (StudentService)this.getObjByBeanId("student");
List listStudent =  studentdo.findAll();
if(listStudent!=null){
for(int i=0;i<listStudent.size();i++){
CdStudent student = (CdStudent)listStudent.get(i);
System.out.println(student.getStudentName());
Iterator itrstuclass = student.getCdClassStudents().iterator();
while(itrstuclass.hasNext()){
System.out.println(student.getStudentName());
CdClassStudent classstudent = (CdClassStudent)itrstuclass.next();
System.out.println(classstudent.getStatus());
}
}
}
错误:javax.servlet.ServletException: failed to lazily initialize a collection of role: czdiso.school.member.po.CdStudent.cdClassStudents, 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.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
czdiso.inf.Filter.doFilter(Filter.java:22)
root cause org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: czdiso.school.member.po.CdStudent.cdClassStudents, 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.initialize(AbstractPersistentCollection.java:343)
org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
czdiso.school.member.action.MemberAction.memberList(MemberAction.java:36)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:585)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
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.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
czdiso.inf.Filter.doFilter(Filter.java:22)

解决方案 »

  1.   

    <many-to-one name="cdStudent" class="czdiso.school.member.po.CdStudent" fetch="select" lazy="false"
                <column name="StudentId" /> 
            </many-to-one> 加上红字部分
      

  2.   

    如果不行,就把lazy="false" 放到hibernate对应文件中表的配置中如
    <class name="com.sina.entity.SysUser" table="sys_user" schema="dbo" catalog="clientManage" lazy="false">
      

  3.   

    用lazy="false"javax.servlet.ServletException
    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.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    czdiso.inf.Filter.doFilter(Filter.java:22)
    root cause java.lang.NullPointerException
    org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
    org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
    org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
    org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
    org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
    org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
    org.hibernate.type.EntityType.resolve(EntityType.java:303)
    org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
    org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
    org.hibernate.loader.Loader.doQuery(Loader.java:717)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    org.hibernate.loader.Loader.loadCollection(Loader.java:1919)
    org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
    org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
    org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
    org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
    org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109)
    org.hibernate.collection.PersistentSet.size(PersistentSet.java:114)
    czdiso.school.member.action.MemberAction.memberList(MemberAction.java:38)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:585)
    org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    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.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    czdiso.inf.Filter.doFilter(Filter.java:22)
      

  4.   

    改用JPA了,实在是受不了XML的折磨!
      

  5.   

    Hibernate 一对多外键单向关联 
      
        这种情况很少见,但Hibernate同样允许采用连接表关联1-1.有连接表的1-1同样只需要将N-1的many-to-one元素增加unique="true"属性即可。 
      
    一、模型介绍 
      
    一个人(Person)对应多个地址(Address),比如家庭地址、公司地址。 
      
    二、实体(省略getter、setter方法) 
      
    public class Person1nfk implements Serializable { 
        private int personid; 
        private String name; 
        private int age; 
        private Set addresses=new HashSet(); 
      
    public class Address1nfk implements Serializable { 
        private int addressid; 
        private String addressdetail; 
      
    三、表模型 
      
    mysql> desc address_1nfk; 
    +---------------+--------------+------+-----+---------+----------------+ 
    | Field         | Type         | Null | Key | Default | Extra          | 
    +---------------+--------------+------+-----+---------+----------------+ 
    | addressid     | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | addressdetail | varchar(255) | YES  |     | NULL    |                | 
    | personid      | int(11)      | YES  | MUL | NULL    |                | 
    +---------------+--------------+------+-----+---------+----------------+ 
      
    mysql> desc person_1nfk; 
    +----------+--------------+------+-----+---------+----------------+ 
    | Field    | Type         | Null | Key | Default | Extra          | 
    +----------+--------------+------+-----+---------+----------------+ 
    | personid | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | name     | varchar(255) | YES  |     | NULL    |                | 
    | age      | int(11)      | YES  |     | NULL    |                | 
    +----------+--------------+------+-----+---------+----------------+ 
      
    四、生成的SQL脚本 
      
      /* Formatted on 2007/08/21 10:06 (QP5 v5.50) */ 
      CREATE TABLE `address_1nfk` ( 
        `addressid` int(11) NOT NULL auto_increment, 
        `addressdetail` varchar(255) default NULL, 
        `addresses` int(11) default NULL, 
        PRIMARY KEY  (`addressid`), 
        KEY `FK9B93456DC08D1667` (`addresses`), 
        CONSTRAINT `FK9B93456DC08D1667` FOREIGN KEY (`addresses`) REFERENCES `person_1nfk` (`personid`) 
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk; 
      
      /* Formatted on 2007/08/21 10:07 (QP5 v5.50) */ 
      CREATE TABLE `person_1nfk` ( 
        `personid` int(11) NOT NULL auto_increment, 
        `name` varchar(255) default NULL, 
        `age` int(11) default NULL, 
        PRIMARY KEY  (`personid`) 
      ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk; 
      
      
    五、映射方法:在实体类Person里面添加Address的集合,即可形成一对多关系。 
            <!--映射集合属性,关联到持久化类,inverse="false"表示主控端在Person1nfk端,lazy="false"表示不采用延迟加载--> 
            <set name="addresses" 
                 table="ADDRESS_1nfk" 
                 cascade="all" 
            > 
                <!--确定关联的外键列--> 
                <key column="personid"/> 
                <!--用以映射到关联类属性--> 
                <one-to-many class="com.lavasoft.dx._1_n_fk.Address1nfk"/> 
            </set> 
      
    <hibernate-mapping> 
        <class name="com.lavasoft.dx._1_n_fk.Person1nfk" table="PERSON_1nfk"> 
            <id name="personid"> 
                <generator class="identity"/> 
            </id> 
            <property name="name"/> 
            <property name="age"/> 
            <!--映射集合属性,关联到持久化类,inverse="false"表示主控端在Person1nfk端,lazy="false"表示不采用延迟加载--> 
            <set name="addresses" 
                 table="ADDRESS_1nfk" 
                 cascade="all" 
            > 
                <!--确定关联的外键列--> 
                <key column="personid"/> 
                <!--用以映射到关联类属性--> 
                <one-to-many class="com.lavasoft.dx._1_n_fk.Address1nfk"/> 
            </set> 
        </class> 
    </hibernate-mapping> 
      
    <hibernate-mapping> 
        <class name="com.lavasoft.dx._1_n_fk.Address1nfk" table="ADDRESS_1nfk"> 
            <id name="addressid"> 
                <generator class="identity"/> 
            </id> 
            <property name="addressdetail"/> 
        </class> 
    </hibernate-mapping> 
      
      
    六、测试方法 
      
    public class Test_1nfk { 
        public static void main(String[] args){ 
            Address1nfk add1=new Address1nfk(); 
            Address1nfk add2=new Address1nfk(); 
            Person1nfk p=new Person1nfk(); 
      
            add1.setAddressdetail("郑州市经三路"); 
            add2.setAddressdetail("合肥市宿州路"); 
            p.setName("wang"); 
            p.setAge(30); 
            p.getAddresses().add(add1); 
            p.getAddresses().add(add2); 
      
            Session session= HibernateUtil.getCurrentSession(); 
            Transaction tx=session.beginTransaction(); 
            session.save(add1); 
            session.save(add2); 
            session.save(p); 
            tx.commit(); 
            HibernateUtil.closeSession(); 
        } 

      
    七、测试结果 
      
    1) :正常保存. 
    //        session.save(add1); 
    //        session.save(add2); 
            session.save(p); 
    Hibernate: insert into PERSON_1nfk (name, age) values (?, ?) 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
    Hibernate: update ADDRESS_1nfk set personid=? where addressid=? 
    Hibernate: update ADDRESS_1nfk set personid=? where addressid=? 
      
    2) :正常保存. 
            session.save(add1); 
            session.save(add2); 
            session.save(p); 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
    Hibernate: insert into PERSON_1nfk (name, age) values (?, ?) 
    Hibernate: update ADDRESS_1nfk set personid=? where addressid=? 
    Hibernate: update ADDRESS_1nfk set personid=? where addressid=? 
      
    3) :正常保存. 
            session.save(add1); 
            session.save(add2); 
    //        session.save(p); 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
    Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?) 
      
      
      

  6.   

    javax.servlet.ServletException
    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.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    czdiso.inf.Filter.doFilter(Filter.java:21)
    root cause java.lang.NullPointerException
    org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
    org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
    org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
    org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
    org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
    org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
    org.hibernate.type.EntityType.resolve(EntityType.java:303)
    org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
    org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
    org.hibernate.loader.Loader.doQuery(Loader.java:717)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    org.hibernate.loader.Loader.loadCollection(Loader.java:1919)
    org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
    org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
    org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
    org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
    org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
    org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
    czdiso.school.member.action.MemberAction.memberList(MemberAction.java:43)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:585)
    org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    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.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    czdiso.inf.Filter.doFilter(Filter.java:21)