zoukankan      html  css  js  c++  java
  • JPA学习03

    滴水穿石

     单向多对一

    外键关联关系的创建

    //映射单向多n-1的关联关系
        //使用@ManyToOne 来映射多对一的关联关系
        //使用@JoinColumn 来映射外键
        @JoinColumn(name = "CUSTOMER_ID")
        @ManyToOne
        public Customer getCustomer() {
            return customer;
        }

    单元测试

    @Test
        public void TestManyToOnePersist(){
            Customer customer = new Customer();
            customer.setAge(32);
            customer.setEmail("3232@cfb.com");
            customer.setName("azsd");
            
            Order order1 = new Order();
            order1.setOrderName("order1");
            
            Order order2 = new Order();
            order2.setOrderName("order2");
            
            order1.setCustomer(customer);
            order2.setCustomer(customer);
            
            entityManager.persist(customer);
            entityManager.persist(order1);
            entityManager.persist(order2);
        }

    上边我们是先保存 customer ,后保存order 的,如果反着来呢?

    @Test
        public void TestManyToOnePersist(){
            Customer customer = new Customer();
            customer.setAge(43);
            customer.setEmail("432@cfb.com");
            customer.setName("sras");
            
            Order order1 = new Order();
            order1.setOrderName("order1");
            
            Order order2 = new Order();
            order2.setOrderName("order2");
            
            order1.setCustomer(customer);
            order2.setCustomer(customer);
            
            entityManager.persist(order1);
            entityManager.persist(order2);
            entityManager.persist(customer);
        }

    我们看到保存依然成功,但是SQL执行的顺序,先执行的order的插入操作并没有插入外键

    而是在customer执行插入完成后,再执行了两个 update()操作

    所以

    保存多对一是,建议先保存 1 的一端,后保存 n 的一端,减少开销

     -----

    查询

    @Test
        public void TestFindOrder(){
            
            Order order = entityManager.find(Order.class, 1);
            
            System.out.println(order.toString());
        }

    查询使用的左外连接来获取  n 的一端 和与其关联的 1 的一端

     ------

    可以使用@ManyToOne 的fetch 属性来修改关联属性的加载策略

    @ManyToOne(fetch=FetchType.LAZY)

    测试结果:

     ---

    删除有外键关联的数据

    @Test
        public void TestManyToOneRemove(){
            
            Customer customer = entityManager.find(Customer.class, 5);
            
            entityManager.remove(customer);
        }

    删除失败

    不能删除被当做外键使用的 1 端的数据

    如果是 @oneToMany的情况下就不同了

    如果删除 1 的一端,会删除成功

    默认会把 n 端的外键置空为 null

    cascade 的属性来设置级联删除

    cascade={CascadeType.REMOVE}

    —————————————————————————————————————————————————————————————————————————

    无论如何,心平气和

  • 相关阅读:
    .net core 2.x默认不支持gb2312
    获取枚举描述
    C#中DateTime.Ticks
    验证组件FluentValidation的使用示例
    python计算出现错误
    EF的导航属性
    webpack不打包指定的js文件
    递归树处理,配合vue的vueTreeselect组件使用
    elementUI 日期时间选择器el-date-picker开始时间与结束时间约束
    Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/7243665.html
Copyright © 2011-2022 走看看