最近在做一个CMS管理项目,在RBAC模型创建时,遇到一个小疑问。
我们知道使用Hibernate可以使用many-to-many的注解或xml配置来自动完成多对多映射,例如:User Role Group三个对象,以User和Group为例。
在数据库表中必然存在一个t_user_group的table表,使用Hibernate完全可以在不建立UserGroup对象的情况就完成级联添加、删除、查询等操作。
目前来看,我们在实体模型中是没有必要创建UserGroup这个关联对象的。
但是如果遇到下面一种情况:项目Service层中频繁的需要User和Group两个对象一起查询使用,那么这时候UserGroup这个对象看起来又像是有必要建立了。
分析到这一步,只许对比这种情况下两种方法向数据库发送的语句条数就可以基本分析出需不需要建立UserGroup对象了。
先看不使用UserGroup时:
String hql = "select u,gs from User u left join u.groups gs where u.id>? and gs.id>?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setParameter(0, 4);
query.setParameter(1, 1);
List<Object[]> gs = query.list();
for(Object[] object:gs){
User u = (User)object[0];
Group g = (Group)object[1];
System.out.println(u.getUsername()+"---"+g.getName());
}
以下是控制台输出的sql语句,只有一条,并且可以
Hibernate: select user0_.id as id1_0_, group2_.id as id0_1_, user0_.email as email1_0_, user0_.password as password1_0_, user0_.username as username1_0_, group2_.description as descript2_0_1_, group2_.name as name0_1_ from t_user user0_ left outer join t_group_user
groups1_ on user0_.id=groups1_.uid left outer join t_group group2_ on groups1_.gid=group2_.id where user0_.id>? and group2_.id>?
结果:
niuba---group3
niuba---group2
wujiu---group2
zhaoqi---group3
zhangsan1111---group3
zhangsan1111---group2
所以没必要在做UserGroup的另一个测试了,因为最少也需要一条语句。
结论:即使需要经常将User和Group一起成对的使用,也没必要建立UserGroup关联对象。只需在UserDao方法中实现相应的方法,然后返回一个List集合(集合的内容为一个Object的数据——Object[ ]),然后在Object[ ]中将User和Group一一取出即可。