用Myeclipse自动生成hbm文件,想让实现,hibernate的关联加载,
写的是,省和市的关联省表的bhm<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.dy.MyLy.hb.entity.Critically" table="critically" catalog="ly_db">
        <id name="criticallyId" type="java.lang.Integer">
            <column name="criticallyID" />
            <generator class="native" />
        </id>
        <property name="criticallyName" type="java.lang.String">
            <column name="critically_Name" length="18" />
        </property>
        <set name="regions" inverse="true">
            <key>
                <column name="criticallyID" not-null="true" />
            </key>
            <one-to-many class="com.dy.MyLy.hb.entity.Region" />
        </set>
        <set name="pinpoints" inverse="true">
            <key>
                <column name="criticallyID" />
            </key>
            <one-to-many class="com.dy.MyLy.hb.entity.Pinpoint" />
        </set>
    </class>
</hibernate-mapping>
市表的hbm<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.dy.MyLy.hb.entity.Region" table="region" catalog="ly_db">
        <id name="regionId" type="java.lang.Integer">
            <column name="RegionID" />
            <generator class="native" />
        </id>
        <many-to-one name="critically" class="com.dy.MyLy.hb.entity.Critically" fetch="select">
            <column name="criticallyID" not-null="true" />
        </many-to-one>
        <property name="regionName" type="java.lang.String">
            <column name="Region_Name" length="10" not-null="true" />
        </property>
        <set name="pinpoints" inverse="true">
            <key>
                <column name="RegionID" />
            </key>
            <one-to-many class="com.dy.MyLy.hb.entity.Pinpoint" />
        </set>
    </class>
</hibernate-mapping>问题,要是在省表<set>上加上lazy=false,会在对象创建时,就把关联对象加载上去,要是让lazy=true,就会报错
错误代码:[@APPNAME@] ERROR [http-80-1] LazyInitializationException.<init>(19) | failed to lazily initialize a collection of role: com.dy.MyLy.hb.entity.Critically.regions, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.dy.MyLy.hb.entity.Critically.regions, 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.iterator(PersistentSet.java:138)
at com.dy.MyLy.struts.action.RegionAction.findRegion(RegionAction.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.dy.MyLy.util.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:105)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

     com.dy.MyLy.struts.action.RegionAction.findRegion(RegionAction.java:56)
    这里引用了一个已经关闭的session进行查询,代码检查下
      

  2.   

    你就设置lazy=false,其实真正的原因我也不是很清楚,只知道这样的话可以让session延迟
      

  3.   


    这一行,就是一表对象使用了set属性,加载多表对象的语句
      

  4.   

     <set name="pinpoints" inverse="true" lazy=false>
                <key>
                    <column name="RegionID" />
                </key>
                <one-to-many class="com.dy.MyLy.hb.entity.Pinpoint" />
    </set>lazy代表什么时候加在关联的一对的集合,lazy=false代表加载此类时就加载此集合信息,true代表用到是加载 (.集合访问时),但用到时候,你的session已经关闭,所以报错
      

  5.   

    我的是SSH整合的框架,session是Spring管理的,我没显式的关闭
      

  6.   

    第一种方法是:支持lazy加载 第二种方法是 配置opensessioninview