hibernate多对多关系映射问题,show_sql输出的语句都能查询出结果,但在类里却没结果

northenwolf1 2008-08-26 12:58:14
如题:
三表的结构:
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>
...全文
757 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hardycheng 2010-07-12
  • 打赏
  • 举报
回复
lz这个问题解决了么有 ? 我现在也遇到这样的问题了,看到网上说是把lazy设置为 false就行了
可是我设置false ,对应的 set还是空的,但是sql语句已经打印出来了
northenwolf1 2008-08-26
  • 打赏
  • 举报
回复
顶一下

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧