• Hibernate JPA 关联关系


     

    Hibernate JPA 关联关系:

      使用cascade做级联操作(只有在满足数据库约束时才会生效):

        CascadeType.PERSIST:

          级联保存,只有调用persist()方法,才会级联保存相应的数据

        CascadeType.REFRESH:

          级联刷新,当多个用户同时操作一个实体,为了用户取到的数据是实时的,在使用实体中的数据之前就调用一下refresh()方法

        CascadeType.MOVE:

          级联删除,当调用remove()方法删除实体时会先删除相关联的数据

        CascadeType.MERGE:

          级联更新,调用merge()方法时会更新实体中的数据

        CascadeType.ALL:

          包含以上所有级联属性

    Hibernate JPA 一对一:   

       在person端配置关联,只保存person端

        //关联身份证
        @OneToOne(mappedBy="person", cascade=CascadeType.ALL)
        private Card card;
        //关联公民
        @OneToOne
        @JoinColumn(name="person_id")
        private Person person;
            Person p = new Person();
            p.setName("draco");
            
            Card c = new Card();
            c.setCardno("001");
            
            p.setCard(c);
            
            session.save(p);

    Hibernate JPA 一对多:

       2.1 没有关联,两端同时保存

        //一端:一对多
        @OneToMany(mappedBy="customer")
        private Set<Order> orders = new HashSet<Order>();
        //多端:多对一
        @ManyToOne
        @JoinColumn(name="custmer_id") 
        private Customer customer;
            Customer c = new Customer();   
            c.setName("draco");    
            
            Order o = new Order();
            o.setProductName("apple");
            
            c.getOrders().add(o);
            
            session.save(o);
            session.save(c);

      2.2 在一端配置关联,只保存一端

        //一对多
        @OneToMany(mappedBy="customer", cascade={CascadeType.PERSIST})
        private Set<Order> orders = new HashSet<Order>();
            Customer c = new Customer();   
            c.setName("draco3");    
            
            Order o = new Order();
            o.setProductName("apple3");
            
            c.getOrders().add(o);   
        
         //session.save(c); session.persist(c);

      

    Hibernate JPA 多对多:

      3.1 没有配置关联,两端同时保存

        //关联用户
        @ManyToMany(mappedBy="roles")
        private Set<User> users = new HashSet<User>();
        //关联角色
        @ManyToMany
        @JoinTable(
            name = "t_user_role1",
            joinColumns=@JoinColumn(name="user_id"),
            inverseJoinColumns=@JoinColumn(name="role_id")
        )
        private Set<Role> roles = new HashSet<Role>();
            User u = new User();
            u.setName("draco");
            
            Role r = new Role();
            r.setName("VIP");
            
            u.getRoles().add(r);
           
            session.save(u);
            session.save(r);

     3.2 在user端配置关联,只保存user

     @ManyToMany(cascade={CascadeType.ALL})
            User u = new User();
            u.setName("draco2");
            
            Role r = new Role();
            r.setName("VIP2");
            
            u.getRoles().add(r);
            
            session.save(u);    

     

     Hibernate JPA 小结结(mappedBy | @JoinColumn | cascade):

      mappedBy:

          1 当关联关系的双方都不配置mappedBy属性,那么双方会互相生成外键,并且执行3条SQL(2条插入SQL,1条额外的维护外键的SQL)

          2 没有配置mappedBy属性的一方生成外键

        3 mappedBy和@JoinColumn不能配置在同一方(否则以mappedBy为准)

          4 只能有一方配置mappedBy

       cascade:

        1 在哪一方配置级联,就对哪一方进行session操作

        2 在哪一方配置级联,就应把另一方作为属性

        3 在有外键的一方配置级联,另一方作为属性填充外键

  • 相关阅读:
    day23
    day22
    day21
    day20
    day19
    day18
    day17
    day16
    day15
    PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
  • 原文地址:https://www.cnblogs.com/roxy/p/7647125.html
Copyright © 2020-2023  润新知