hibernate多对多关系映射问题,show_sql输出的语句都能查询出结果,但在类里却没结果
如题:
三表的结构:
s_role role_m_power s_power
id id id
role_memo role_id icon
dept power_id menu_name
.
.
要得到某个角色所拥有的所有权限,采用多对多映射
junit测试方法:
public void testSaveSRole(){
SRole role = new SRole();
role.setId("001");
role.setDept("003");
role.setRoleMemo("调度中心主管");
roleDAO.saveSRole(role);
assertNotNull("Save User Success!",role.getId());
SPower power = null;
Set r = role.getSPower();
System.out.println(role.getRoleMemo()+"= ="+role.getId());
System.out.println(role.getSPower().size());
Iterator it = r.iterator();
while(it.hasNext()){
power = (SPower)it.next();
System.out.println(power.getMenuName());
}
}
show_sql属性输出两个sql语句:
Hibernate: select srole0_.id as id2_0_, srole0_.role_memo as role2_2_0_, srole0_.dept as dept2_0_ from GGT2.dbo.s_role srole0_ where srole0_.id=?
Hibernate: select spower0_.role_id as role1_1_, spower0_.power_id as power2_1_, spower1_.id as id1_0_, spower1_.icon as icon1_0_, spower1_.menu_name as menu3_1_0_, spower1_.file_url as file4_1_0_, spower1_.parent_id as parent5_1_0_, spower1_.isPop as isPop1_0_, spower1_.sequence as sequence1_0_, spower1_.isForbid as isForbid1_0_, spower1_.sub_menus as sub9_1_0_, spower1_.creat_date as creat10_1_0_, spower1_.define1 as define11_1_0_, spower1_.define2 as define12_1_0_ from role_m_power spower0_ left outer join GGT2.dbo.s_power spower1_ on spower0_.power_id=spower1_.id where spower0_.role_id=?
简化后的两的SQL语句:
select * from s_role where id=?
select * from role_m_power a left outer join s_power b on a.powerid=b.id where a.role_id=?
根据测试方法,参数应为001,直接或修改后在查询分析器里运行都能正常得到结果,而且运行时在事件控查器中也监测到有这两个语句执行,
但在测试方法的两个输出语句中,第一句能输出预期的结果,即角色id为001的id和roleMemo,但第二句输出,即该角色所拥有的权限属性却没有加载进去,SRole.hbm.xml中SET的lazy设置成真或假都是一样的,请教各位高人给予指点,谢谢!
SRole.hbm.xml文件
<?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 - Hibernate Tools
-->
<hibernate-mapping>
<class name="cn.ls.ggt.model.SRole" table="s_role" schema="dbo" catalog="GGT2">
<id name="id" type="java.lang.String">
<column name="id" length="50" />
<generator class="assigned" />
</id>
<property name="roleMemo" type="java.lang.String">
<column name="role_memo" length="50" />
</property>
<property name="dept" type="java.lang.String">
<column name="dept" length="50" />
</property>
<set name="SPower" table="role_m_power" lazy="false" cascade="save-update" sort="unsorted" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
<key column="role_id" on-delete="noaction"/>
<many-to-many class="cn.ls.ggt.model.SPower" column="power_id" embed-xml="true" not-found="exception" unique="false"></many-to-many>
</set>
</class>
</hibernate-mapping>
对应的POJO类中增加
private Set SPower = new HashSet();
public void setSPower(Set spower){
this.SPower = spower;
}
public Set getSPower(){
return SPower;
}
其它的为eclipse自动生成的代码
SPower.hbm.xml文件
<?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 - Hibernate Tools
-->
<hibernate-mapping>
<class name="cn.ls.ggt.model.SPower" table="s_power" schema="dbo" catalog="GGT2">
<id name="id" type="java.lang.String">
<column name="id" length="50" />
<generator class="assigned" />
</id>
<property name="icon" type="java.lang.String">
<column name="icon" length="50" />
</property>
<property name="menuName" type="java.lang.String">
<column name="menu_name" length="50" not-null="true" />
</property>
<property name="fileUrl" type="java.lang.String">
<column name="file_url" length="80" />
</property>
<property name="parentId" type="java.lang.String">
<column name="parent_id" length="50" not-null="true" />
</property>
<property name="isPop" type="java.lang.String">
<column name="isPop" length="1" />
</property>
<property name="sequence" type="java.lang.Integer">
<column name="sequence" />
</property>
<property name="isForbid" type="java.lang.String">
<column name="isForbid" length="1" />
</property>
<property name="subMenus" type="java.lang.Integer">
<column name="sub_menus" />
</property>
<property name="creatDate" type="java.util.Date">
<column name="creat_date" length="23" />
</property>
<property name="define1" type="java.lang.String">
<column name="define1" length="50" />
</property>
<property name="define2" type="java.lang.String">
<column name="define2" length="50" />
</property>
</class>
</hibernate-mapping>