Hibernate多对多操作步骤(二)

2014-11-24 08:56:48 · 作者: · 浏览: 4
...... //是否级联操作、联表查询,从上层Hibernate API无法看出,关键在.hbm.xml中。
return list;
}
注意:查出的list的意义。

5)BO (main)中,写调用该DAO方法:
List list= DAO对象.listAllUsrCascadeAuthorization();

Usr userpo=(Usr)list.get(0); //这个是一个Usr PO对象。
Set st=userpo.getAuths(); //取出该Usr PO对象中的关联属性Set
//遍历HashSet,it.next(),取出的是该Usr PO的一个权限PO。 ----晒晒老知识:Set只能遍历,不易于单个读取。

//注意:检索策略;User----Authorization;默认使用延迟检索;---所以,不要关闭Session;
如果改为立即检索;---则可能提取出所有的权限对象;www.2cto.com
如果再配有反向的Authorization----User;且为立即检索,---则连锁效应可能提取大量无用的关联对象;

作业:撰写代码实现查询,查出《usr表》中name='张局长' 的user用户,其所拥有的各个(或第一个)权限,和其他哪些用户同时拥有这些权限?
要求:必须列出张局长拥有哪些权限,及其权限名;
还要列出每个权限所有拥有者的用户名;

答案:
---BO:
UserDao userDao = new UserDao();
User findUserByName = userDao.findUserByName("张局长");
System.out.println("张局长的ID号: "+findUserByName.getId());
Set auths = findUserByName.getAuths(); //▲延迟加载,关联集合其中PO为代理对象;
//▲注意:因为是延迟加载,所以自动使用Hibernate实现的PersistenceSet,不能强制转换回HashSet;
System.out.println("权限个数: "+auths.size()); //▲用到此PO时,临时加载;
Iterator it = auths.iterator();
while(it.hasNext()){
Authorization az = (Authorization)it.next(); //◆取出一个权限对象; 用到此PO时,临时加载;
System.out.println("==权限ID号为:"+az.getId()); //用到此PO属性时,临时加载属性值;
System.out.println("权限号为:"+az.getAuth());
//提取该权限的所有用户; 也是延迟加载;
Set users = az.getUsers();//拿到该权限的用户集合;
Iterator iterator = users.iterator();//遍历该用户集合;
while(iterator.hasNext()){
User user = (User)iterator.next(); //◆取出一个拥有该权限的用户; 用到此PO时,临时加载;
System.out.println("\t拥有该权限的用户:"+user.getName()+"\t用户ID号: "+user.getId()); //用到此PO时,临时加载;
}
}
//关闭Session;
//如果后续还要使用该Session,进行其他Dao操作,则仅关闭该Session缓存,但并不使其消失;
userDao.sessionClose(); www.2cto.com
所有操作完毕后,无需Session,此时应关闭Session使其消失;
userDao.closeSession();


数据例子: 《user表》中,1号的张局长,《userauth表》中,拥有:10号、22号权限;
4号 赵科长, 也拥有:10号;
5号 刘。。, ......:10号;
《userauth》表

┌───┬───┬───┐
│ id │ uid │ auid │
├───┼───┼───┤
│ 1 │ │ │
├───┼───┼───┤
│ 2 │ 1 │ 10 │
├───┼───┼───┤
│ 3 │ 2 │ 15 │
├───┼───┼───┤
│ 4 │ 1 │ 22 │
├───┼───┼───┤
│ 5 │ │ │
├───┼───┼───┤
│ │ │ │
├───┼───┼───┤
│ │ 5 │ 10 │
├───┼───┼───┤
│ │ 2 │ 22 │
└───┴───┴───┘

结果:全部延迟加载,连表查询,用的是单表select语句实现。


总结:*-*的检索策略,与1-*的检索策略,相同;
━━━━━━━━━━━━━━━━━━
延迟加载:lazy="true"
立即加载:lazy="false" fetch="select"
预先抓取:lazy="false" fetch="join"

作者:oh_Mourinho