现象:
在使用struts+Spring+Hibernate时,执行多对一查询时,出现异常!代码如下:
Hibernate影射文件:
SGroup.hbm.xml
<hibernate-mapping>
<class name="com.news.Hibernate.SGroup" table="S_GROUP" schema="WHY">
<id name="groupid" type="java.lang.Integer">
<column name="GROUPID" precision="22" scale="0" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" />
</property>
<property name="remark" type="java.lang.String">
<column name="REMARK" length="500" />
</property>
<property name="status" type="java.lang.Integer">
<column name="STATUS" precision="22" scale="0" not-null="true" />
</property>
<set name="SGroupPrvs" inverse="true" cascade="all" lazy="true">
<key>
<column name="GROUPID" precision="22" scale="0"/>
</key>
<one-to-many class="com.news.Hibernate.SGroupPrv"/>
</set>
</class>
</hibernate-mapping>
SGroupPrv.hbm.xml
<hibernate-mapping>
<class name="com.news.Hibernate.SGroupPrv" table="S_GROUP_PRV" schema="WHY" lazy="true">
<composite-id>
<key-many-to-one name="SGroup" class="com.news.Hibernate.SGroup">
<column name="GROUPID" precision="22" scale="0"/>
</key-many-to-one>
<key-many-to-one name="SPrivilege" class="com.news.Hibernate.SPrivilege">
<column name="PRIVILEGE" precision="22" scale="0" />
</key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>
java文件:
else if(action!=null && action.equals("del")){
String groupid=request.getParameter("groupid");
System.out.print("组名id:"+groupid);
SGroup groups=groupManager.getSGroup(groupid);
groups.setGroupid(Integer.parseInt(groupid));
System.out.println("groupid:"+groups.getGroupid());
System.out.println("groupname:"+groups.getName());
System.out.print("是否实例化:"+Hibernate.isInitialized(groups));
if(!Hibernate.isInitialized(groups))
Hibernate.initialize(groups);
Set<SGroupPrv> set=groups.getSGroupPrvs();
System.out.print("是否实例化:"+Hibernate.isInitialized(set));
if(!Hibernate.isInitialized(set))
Hibernate.initialize(set);
System.out.print("是否实例化:"+Hibernate.isInitialized(set));
System.out.println(set.size());
}
如果数据库中没有记录,则一切正常;如果数据库中有记录,则出现java.lang.NullPointerException 异常。
解决方式:
经在网上搜索后,终于找到解决的方法,现在与大家一起分享!
1、升级cglib_2.1.3.jar至cglib_2.2.jar;
2. 或者
更改加载方式为立即加载!即在多对一的影射中增加: lazy="false"
SGroupPrv.hbm.xml 采用的复合主键,所以不好修改
例如: *.hbm.xml:
<many-to-one name="SGroup"
class="com.news.Hibernate.SGroup" fetch="select" lazy="false" insert="false" update="false">
<column name="GROUPID" />
</many-to-one>