【学习笔记-SSH框架】Hibernate进阶-笔记01-Hibernate关联关系

笔记01-Hibernate关联关系

目录

  • 1-N关联
    • 单向N-1关联
    • 单向1-N关联
    • 双向1-N关联
  • 1-1关联
  • N-N关联
  • 级联关系

1. 1-N关联

  • 1、单向N-1关联

    • 从N的一段可以访问1的一端
    • 例如:多个订单信息对应一个客户,只需从订单信息中就可以找到关联的客户信息
        /**
       * 单向N-1:测试添加客户和订单信息
       * 多个订单对应一个客户
       */
      @Test
      public void testAddCustomerOrder() throws Exception {
          Customer customer = new Customer("李步官", "123456", "韶关");
          CustomerDao.addCustomer(customer);
    
          Order order1 = new Order(1, new Date(), customer);
          Order order2 = new Order(2, new Date(), customer);
    
          //添加订单信息
          OrderDao.addOrder(order1);
          OrderDao.addOrder(order2);
    
          HibernateUtil.closeSession();
      }
    
    
  • 2、单向1-N关联

    • 相对于单向N-1关联,单向1-N关联关系中的1端对应多个对象
    • 例如:一个客户有多个订单
    • 单向N-1关联的N端采用Set集合的形式,使用set元素来映射1-N关联
    <!--  1-N关联关系  -->
      <set name="orders">
          <key column="customerId"/>
          <one-to-many class="com.chapter06.pojo.Order"/>
      </set>
    
        /**
       * 单向1-N:测试获取用户
       * 一个客户有多个订单信息
       */
      @Test
      public void testGetCustomer(){
          Customer customer = CustomerDao.getCustomer(2);
          Set<Order> orders = customer.getOrders();
          System.out.println("客户:"+ customer.getUsername() +"的订单如下:");
          for (Order order : orders) {
              System.out.println("\nid:" + order.getId()
                      + "\norderNo:" + order.getOrderNo()
                      + "\norderDate:" + order.getDate()
                      + "\ncustomerId:" + order.getCustomer().getUsername()
              );
          }
      }
    
    
  • 3、双向1-N关联

    • 将单向的N-1关联和1-N关联整合在一起就是双向1-N关联
    • 表示可以从1端访问N端,也可以从N端访问1端
    • 例如:可以从订单中查询客户,也可以从客户中查询订单

2. 1-1关联

  • 1、基于外键单向1-1关联
    可以理解为N端为1的单向N-1关系

    • pojo类的代码类似于单向的N-1,因为N的一端或1的一端都是直接访问关联实体
    • 对于映射配置,基于外键的单向1-1需要在元素中配置unique属性为true
    • 通过在N端添加唯一约束的方法,将单向N-1变成等同于基于外键的单向1-1关联关系
  • 2、基于主键单向1-1关联
    持久化类不能拥有自己的主键生成器策略,其主键由关联实体负责生成

    • 基于主键关联的持久化类不能有自己的主键生成器策略,其主键由关联实例来负责生成
    • 使用元素来映射关联实体
  • 3、基于外键双向1-1关联
    存放外键的一端增加元素,而另一端需要使用元素。

    • 外键可以存放在任意一边
    • 外键的一端需要增加元素,并将该元素的unique属性值设置为true
    • 另一端则使用元素
  • 4、基于主键双向1-1关联
    两个关联表使用相同的主键值

    • 与基于主键的单向1-1关联类似
    • 在没有标记的乙方增加标记,从而建立了双向的一对一关联

3. N-N关联

在实际开发过程中,数据表之间的N-N关联使用不多,通常是拆分成两个1-N关联来实现。同样也可以采用两个1-N来代替N-N关联。

4. 级联关系

级联是指对一个对象进行修改、删除、更新等操作时,被关联的对象也需进行相应的操作。

在这里插入图片描述

<!--  1-N关联关系  -->
        <set name="orders" cascade="save-update">
            <key column="customerId"/>
            <one-to-many class="com.chapter06.pojo.Order"/>
        </set>
    /**
     * 测试级联操作
     */
    @Test
    public void testAddCustomerWithCascade() throws Exception {
        Session session = HibernateUtil.getSession();
        Customer customer = new Customer("李四", "123456", "广州");
        Order order1 = new Order(3, new Date(), customer);
        System.out.println("order = " + order1);

        customer.getOrders().add(order1);
        System.out.println("级联保存客户和订单:");
        System.out.println("id = " + customer.getId() +
                "\nname = " + customer.getUsername() +
                "\npass = " + customer.getPassword() +
                "\naddress = " + customer.getAddress()
                );

        session.save(customer);
        HibernateUtil.closeSession();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值