多対一关联映射

简介:
      多対一恐怕是现实世界中存在的最普遍的一种关联关系了。
     hibernate在解决多対一关联映射时提出了一种普遍的思想:在实体模型中通过“多”持有“一”的引用来反映这种关系,在关系模型中通过在“多”的一端增加个外加指向“一”的一端。其实,这种思想还常常用来解决一对一和多对多。
      看看我们的User和Group的实例是怎么实现的吧:
 
1.实体模型:
 
2.关系模型:
 
3.实体类:
  Group.java
public  class Group { 
   private  int id; 
   private String name; 
   //一系列的setter.getter方法 
  @Override 
   public String toString() { 
     return  "Group:"+name; 
  } 
}
 
    User.java
public  class User { 
   private  int id; 
   private String name; 

   private Group group; 
   //一系列的setter.getter方法 
  @Override 
   public String toString() { 
     return  "User:"+name; 
  } 
}
 
4.映射文件:
  Group.hbm.xml
   < class  name ="com.sxt.hibernate.many2one.entity.Group"  table ="sxt_hibernate_group" > 
     < id  name ="id"  length ="4" > 
       < generator  class ="native" > </ generator > 
     </ id > 
     < property  name ="name"  length ="10" > </ property > 
   </ class >
 
     User.hbm.xml
   < class  name ="com.sxt.hibernate.many2one.entity.User"  table ="sxt_hibernate_user" > 
     < id  name ="id"  length ="4" > 
       < generator  class ="native" > </ generator > 
     </ id > 
     < property  name ="name"  length ="10" > </ property > 
    <!-- many-to-one含义,会在多的一端加入一个外键指向一的一端,以供加载时使用.外键由column属性指定,默认和实体属性名相同. 
            cascade操作本对象时级联操作它的关联对象     
--> 
     < many-to-one  name ="group"  column ="group_id"  cascade ="save-update" > </ many-to-one > 
   </ class >
 
5.hibernate配置文件:
  参照前面的。
 
6.测试方法:
   public  static  void main(String[] args) { 
    Session session = HibernateUtils.getSession(); 
    Transaction t = session.beginTransaction(); 
     try { 
       /** 
        * 测试插入数据 
        */
 
/*         Group group = new Group();//情况1.生成一个新的组 g.setName("开发组"); 
        group.setName("研发组"); 
         
        User user1=new User(); 
        user1.setName("奇隆"); 
        user1.setGroup(group); 
         
        User user2=new User(); 
        user2.setName("有朋"); 
        user2.setGroup(group); 
         
        //这里也要保证在save(user)前,它所关联的group要先save或者在User的映射文件中配置上cascade级联save,. 
        session.save(user1); 
        session.save(user2);*/
 
        
/*        Group group=(Group)session.get(Group.class, 2);//情况2.加载数据库中已经存在的组 
         
        User user=new User();     
        user.setName("谢霆锋"); 
        user.setGroup(group); 
        //由于加载的group 已经是持久化的了,所以这样也能保存成功. 
        session.save(user);*/
 
         /** 
         * 小结:保存user之前要保证它所引用对象已经是持久化的,这样在保存user时,hibernate会自动把user的外键指向group的id 
         */
 

      User user = (User) session.get(User. class, 3); // 只是加载了user对象和它所在组的对象group的id属性,并没有加载group对象 
      System.out.println(user); 
      System.out.println(user.getGroup()); 
       /** 
        * 小结:可见,在"多"的一端(user)可以加载"一"的一端(group).当然,这里存在延迟加载策略,有时间专门讨论. 
        */
 
      session.save(user); //由于user已经是持久化的对象,并且没有做出修改,所以这里并不触发任何的sql操作    
         
      user.setName( "郑伊健"); 
      session.save(user); //由于user已经做了改动,所以这里会触发update操作. 
        
      t.commit(); 
    }  catch (HibernateException e) { 
      e.printStackTrace(); 
      t.rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 
}


     本文转自NightWolves 51CTO博客,原文链接: http://blog.51cto.com/yangfei520/274832 ,如需转载请自行联系原作者


相关文章
|
Java 数据库连接
【Jpa hibernate】一对多@OneToMany,多对一@ManyToOne的使用
项目中使用实体之间存在一对多@OneToMany,多对一@ManyToOne的映射关系,怎么设置呢? GitHub地址:https://github.com/AngelSXD/myagenorderdiscount可以查看完整项目 下面给一个例子: 类似于一个部门对应多个员工 这里给出 一个流水账单对应多条订单折扣信息   流水账单类: package com.
8866 0
|
Java 数据库连接 关系型数据库
|
Java 关系型数据库 数据库连接