Hibernate多对多操作步骤
== Hibernate_ManytoMany_(AssociationMapping之一)
(一) 关联映射准备步骤:
1)Table加中间表,加关联字段。无需建立主外键约束。 建立<usr表>、<authorization表>、及中间表<userauth表>。
2)关联映射实现:
方案一)此时已有两个1对*,可以用【两个1对*】配置来实现。
缺点:配置复杂。连表查询时,select语句生成多; 不建议采用。
方案二)用【一个 *---*】,来直接配置实现。
特点:只写一套映射配置----<usr.hbm.xml> + Usr PO────→<authorization.hbm.xml> + Authorization PO只涉及两个PO类、两个《 .hbm.xml》文件。
加了中间表,但并不加<中间表.hbm.xml> 和 PO类;
3)先用工具,生成两个多端的单表配置;
4)两端PO添加关联属性集合
private Set auths = new HashSet();
private Set users = new HashSet();
5)再添加 <表名.hbm.xml>中的关联映射配置:
特点: 多对多 和 一对一 一样,两边配置都十分对称。
本质:可以看到多对多其实就是一对多;<set、lazy=、cascade=、inverse=、<key等都是按1对多来走的;
一对一、多对多 两边配置都十分对称。
<set name="auths" table="userauth"---中间表名
azy="true"
cascade="all"---六种
inverse="false"
<key colume="userid"/>-----表中有关联字段时,设置此项,中间表关联本端的字段名
<many-to-many class="包名.Authorization" column="authid"/>
</set>
◇◇中间表的id,最好设置为自动增长;否则级联插入时,中间表的主键id,因为没法人工设置,只能自动使用缺省值,就只能插入一条;
(二)多对多的操作:
(1)级联插入
---DAO:
/**
* 插入User PO记录,级联插入该用户拥有的权限PO记录;
* @param usr---临时态User PO对象;
*/
public void addUsr(Usr usr){
Transaction tr=null;
Session session=null;
try{
session=HibernateSessionFactory.getSession();
tr=session.beginTransaction();
session.save(usr);//将级联插入该用户拥有的所有权限authorization PO记录
tr.commit();
}catch(Exception e){
e.printStackTrace();
try{
tr.rollback();
}catch(HibernateException he){
he.printStackTrace();
}
}finally{
session.close();
}
}
---BO:张磊磊。
public static void main(String[] args) {
Usr usr=new Usr(); ------------先做好一个新用户;(临时态)
usr.setAddress("changchun");
usr.setName("zhangsan");
usr.setMale("male");
usr.setId(225);//主键,App设置;DB中为varchar 或 int;
Authorization aut=new Authorization(); -----再做好几个该用户拥有的新权限;(临时态)
aut.setColumnId(111);
aut.setAuthorize(new Integer(123));
aut.setInit(new Integer(124));
aut.setId(1008); //主键,
Authorization aut1=new Authorization();-----新权限;
aut1.setColumnId(112);
aut1.setAuthorize(new Integer(113));
aut1.setInit(new Integer(114));
aut1.setId(1009);
//建立两种PO的关联;
Set set1=usr.getAuthorization(); ---先获得关联属性集合Set;(HashSet)
set1.add(aut); //权限集合中加入权限PO;建立关联
set1.add(aut1);
UsrDAO usrdao=new UsrDAO();---调用DAO方法,实现级联插入;
usrdao.addUsr(usr);
}
结果:插左PO记录,级联插入中间表记录,以及右PO记录;
▲ 结论:多对多和一对一 一样,可以只配置单向关联。
=========联表查询=====
//没关联记录时,没显示。
&nbs
补充:软件开发 , Java ,