当前位置:编程学习 > JAVA >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,