分享

多対一关联映射...

 yanjj 2010-11-03
多対一恐怕是现实世界中存在的最普遍的一种关联关系了。
     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);
    }
  }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多