zoukankan      html  css  js  c++  java
  • Hibernate框架学习(六)——一对多&多对一关系

    一、关系表达

    1、表中的表达

    2、实体中的表达

    3、orm元数据中的表达

    一对多:(在Customer.hbm.xml中添加)

    多对一:(在LinkMan.hbm.xml中添加)

    最后别忘了在hibernate.cfg.xml中添加映射文件

    二、操作关联属性

    1、保存客户及客户下的联系人

     1 public class Demo {
     2     @Test
     3     //保存客户以及客户下的联系人
     4     public void fun1(){
     5         //1.获得session
     6         Session session = HibernateUtils.openSession();
     7         //2.开启事务
     8         Transaction tx= session.beginTransaction();
     9         //3.操作
    10         //=================================
    11         Customer c=new Customer();
    12         c.setCust_name("华为");
    13         
    14         LinkMan lm1=new LinkMan();
    15         lm1.setLkm_name("任正非");
    16         
    17         LinkMan lm2=new LinkMan();
    18         lm2.setLkm_name("孙亚芳");
    19         
    20         //表达一对多,客户下有多个联系人
    21         c.getLinkMens().add(lm1);
    22         c.getLinkMens().add(lm2);
    23         
    24         //表达多对一,联系人属于哪个客户
    25         lm1.setCustomer(c);
    26         lm2.setCustomer(c);
    27         
    28         session.save(c);
    29         session.save(lm1);
    30         session.save(lm2);
    31         //=================================
    32         //4.提交事务
    33         tx.commit();
    34         //5.关闭资源
    35         session.close();
    36     }
    37 }

    查看数据库(cst_customer和cst_linkman表结果如下)

    2、为客户增加联系人(只需要改变步骤三操作里的内容)

     1      //1>获得要操作的客户对象
     2         Customer c = session.get(Customer.class,4l);
     3         //2>创建联系人
     4         LinkMan lm1=new LinkMan();
     5         lm1.setLkm_name("尹绪全");
     6         //3>将联系人添加到客户,再将客户设置到联系人中
     7         c.getLinkMens().add(lm1);
     8         lm1.setCustomer(c);
     9         //4>执行保存
    10         session.save(lm1);

    3、为客户删除联系人(依然只需要改变步骤三操作里的内容)

    1         //1>获得要操作的客户对象
    2         Customer c = session.get(Customer.class, 4l);
    3         //2>获得要移除的联系人
    4         LinkMan lm1=session.get(LinkMan.class, 3l);
    5         //3>将联系人从客户集合中移除
    6         c.getLinkMens().remove(lm1);
    7         lm1.setCustomer(null);        

     三、进阶操作

    1、级联操作(简化操作,一定要用save-update,不建议使用delete)

    比方说级联保存更新时,配置文件修改好后可以省略最后联系人的保存操作。

    2、关系维护(性能优化,提高关系维护的性能)

    问题:在保存时,两方都会维护外键关系,关系维护两次,冗余了。

       多余的维护关系语句是客户这一端在维护。

    解决:

    原则:无论怎么放弃,总有一方必须要维护关系。

    一对多的关系中:一的一方放弃,只能一的一方放弃,多的一方不能放弃(外键字段就在多的一方,不能不维护自己的列)。

     3、执行删除客户操作时,不能直接删除

  • 相关阅读:
    Android中NFC编程
    动态的改变程序的主题
    第二章 Libgdx的目标和特性
    第一章 Libgdx简介
    JAVA过滤器和拦截器的区别(个人理解)
    Android下Activity的生命周期
    Ext JS 4.2.1 Beta 1发布了
    【翻译】Ext JS 4.2介绍
    jQuery 1.5发布 Ajax模块重写
    ASP.NET 服务器控件渲染到客户端之后对应的HTML标签
  • 原文地址:https://www.cnblogs.com/cxq1126/p/8444788.html
Copyright © 2011-2022 走看看