• Hibernate学习笔记--------2.一多|多多的CRUD


    一、一多关系

    例如用户(Tb_User)和订单(Tb_Order)之间,一个用户对应了多个订单,多个订单对应一个用户。

    除了基本的配置外,需要在用户类(单方)中添加订单的集合同样需要get/set方法,

    private Set<Tb_Order> orders = new HashSet<Tb_Order>();

    映射文件中添加关于订单的集合配置 one-to-many, <set>中name属性是设置类中关联集合的名称,table属性设置对应的表名,cascade设置增删改的级联操作

    <set name="orders" table="TB_ORDER" cascade="all" inverse="true">
                <key column="userid"></key>
                <one-to-many class="com.lzq.model.Tb_Order" />
    </set>

    在订单中需要添加一个外键关联的类

    private Tb_User user;

    映射文件中添加关于用户类配置 one-to-many

    <!-- 配置多对一 关系 -->
    <many-to-one name="user" class="com.lzq.model.Tb_User" column="userid"></many-to-one>

    1.查询,我们只需要查询任何一方,根据Get方法,在需要时可以自动去查询另外的一方。

    下面的输出结果可以看见打印了user的查询语句和user的名字,再打印了order的查询语句和订单数量

      /**
         * 查找
         */
        @Test
        public void get() {
            Tb_User u = session.get(Tb_User.class, "8cd98f5e-7b7e-46ae-96b5-591f7f2de6b4");
            // 查询 Tb_User 不查询 Tb_Order
            System.out.println(u.getName());
            // 需要时,才会查询Tb_Order
            System.out.println(u.getOrders().size());
        }
    
        @Test
        public void get_Order() {
            Tb_Order u = session.get(Tb_Order.class, "6b545b76-539c-4010-b1be-15bfead6268c");
            // 查询 Tb_Order 不查询Tb_User
            System.out.println(u.getName());
            // 需要时,才会查询Tb_User
            System.out.println(u.getUser().getName());
        }

    2.保存

    可以看见,代码中只保存了user并没有保存order,但是order是保存进去了的,因为在前面的映射配置文件中 cascade="all" 表示增删改都需要级联操作,若不写cascade属性,则需要保存了user后,手动的保存order,删除同理;

    在一对多的关联设置中,若不想设置user,则需要将前面的映射配置文件 inverse属性改为false,否则更新到数据库中的userid为空。

      @Test
        public void add() {
    
            Tb_User u = new Tb_User(HelpUtil.getUUID(), "王五", 1, new Date());
    
            Tb_Order o1 = new Tb_Order(HelpUtil.getUUID(), 698.36, 28, new Date(), "1号订单");
            Tb_Order o2 = new Tb_Order(HelpUtil.getUUID(), 46872.69, 99, new Date(), "2号订单");
            // 多对一的关联设置
            u.getOrders().add(o1);
            u.getOrders().add(o2);
            // 一对多的关联设置
            o1.setUser(u);
            o2.setUser(u);
    
            session.save(u);
    
        }

    二、多多关系

    在多多关系中,如果对中间表没有特殊的操作,则不需要在代码中实现中间表的实体类和映射文件。

    只需要在两个类中加上一个另一个类的集合,在映射文件中配置many-to-many

    例如用户Tb_User和角色Tb_Role

    在用户表中添加集合,并要有get/set方法

    private Set<Tb_Role> roles = new HashSet<Tb_Role>();

    在映射文件中加入多多关系映射,这里的table是多多关系产生的关联表,key是当前类对应关联表中的外键字段,在many-to-many中的class指另一个关联的类,column指另一个类值关联表中的外键

    <set name="roles" table="TB_USERROLE" cascade="all" inverse="false">
                <key column="USERID"></key>
                <many-to-many class="com.lzq.model.Tb_Role" column="ROLEID" />
            </set>

    在Role的映射文件中

    <set name="users" table="TB_USERROLE" inverse="true" cascade="all">
                <key column="ROLEID"></key>
                <many-to-many class="com.lzq.model.Tb_User" column="USERID" />
            </set>

    这里注意下inverse这个属性,我的理解是设置控制方反转,由哪一方来维护数据的统一性,在user配置中,inverse设置为false,意思是维护数据(在这里维护数据就是指在中间表TB_UerRole中插入数据)的操作不用反转,user自己来,在Role中inverse设置为false,就是维护数据让User来,role自己不来做。那么此时,更新了user表时若role有变动,则会去更新中间表,但是若role表中的user有变动,是不会影响其他表的。

    最后附上我做测试的demo:http://pan.baidu.com/s/1sl06Hrv

  • 相关阅读:
    【长篇高能】ReactiveCocoa 和 MVVM 入门
    圆形头像
    C#开发学习——.net C#中页面之间传值传参的方法以及内置对象
    C#开发学习——内联表达式
    C#开发学习——ADO.NET几个重要对象
    Android开发学习——动画
    Android开发学习—— Fragment
    Android开发学习—— ContentProvider内容提供者
    Android开发学习—— Service 服务
    Android开发学习—— Broadcast广播接收者
  • 原文地址:https://www.cnblogs.com/lzq1065763582/p/5678605.html
Copyright © 2020-2023  润新知