zoukankan      html  css  js  c++  java
  • JPA加强(关联关系配置)

    1. 单向一对多
      单向一对多用得比较少(性能差),发送的SQL比单向多对一要多,但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置。

        @OneToMany

          // 必须配置外键id,否则会多生成一张表,形成多对多的关系

          @JoinColumn(name = "dir_id")

          // 建议实例化,用的时候不需要在实例化,这里和单向多对一要求不同

              private Set<Product> products = new HashSet<Product>();

          这个Set不能是HashSet

    1. 单向多对一
      @ManyToOne
      @JoinColumn(name=”dir_id”)
      private Product product;
      注意:这里的一方不能实例化,这里new出来的一方对象相当于是新建的对象,没有主键,无法关联关系

        无论是一对多还是多对一,建立关联关系的时候都是由包含外键的实体调用set方法来建立关联关系

        单向一对多和单向多对一持久化时发送SQL的区别
        单向一对多:无论是先持久化多方还是一方,除了会发送new出来的对象的SQL外,还会调用多方对象发送update的SQL
        单向多对一:如果是先持久化一方再持久化多方,只会发送new出来的对象的SQL;如果是先持久化多方在持久化一方,除了会发送new出来的对象的SQL外,还会调用多方对象发送update的SQL

        一对多要比多对一多发送SQL,所以在性能方面,多对一性能较高

    1. 延迟加载

        a)       当我们查询一对多的一方数据的时候,因为@OneToMany是延迟加载,所以不会发送SQL语句查询多方的数据,所以这时我们就需要改变一方关联关系的抓取策略

        @OneToMany(fetch=FetchType. EAGER)

        b)       判断集合是否有值,就判断他的size是否为0来判断

    1. 集合映射

        a)       集合延迟加载类

     

        b)       声明集合的时候必须使用接口
        因为Hibernate在创建了集合对象后是使用了它的的集合类PersistentSet来接收数据的(而不是我们写的那个HashSet)。如果我们使用接口声明(如Set),那么它的集合类PersistentSet也是实现了这个接    口。所以它可以把这个类赋给Set。 但是我们使用HashSet,它们关系是平级的,不能进行转换,所以就出现错误了。

        c)  集合映射的JAVA类型
        常用的有2种:

        java.util.Set对应PersistentSet

        java.util.List对应PersistentBag

        Set:不能重复,集合里面的元素没有顺序

        List:可以重复,集合里面的元素有顺序,list默认是按照保存顺序排序,要对其他进行排序就用这个注解@OrderBy("price DESC")进行一个排序
        如何选择:怎么选择使用哪一种呢:看数据是否会重复,是否需要顺序

        set一般用在多对多,也有一对多

        list一般只是用在组合关系(什么模型才是组合关系,需要自己分析,这个是需要经验的)

    1. 双向多对一,双向一对多

        a)       配置
        在多方字段上面打上@OneToMany( mappedBy = "dir")
        // mappedBy = "dir"表示一方的关系参照多方实体属性来管理
        
    在一方字段上按照原来的方式配置@ManyToOne(name=”dir_id”

    1. 单向多对多

        a)       在一个实体配置@manytomany

        b)   inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被维护端外键
        JoinColumns = @JoinColumn (name = "student_id" )//维护端外键

    1. 双向多对多

        a)       两个实体类都要配置 @manytomany, @JoinTable(name = "t_role_user",joinColumns = {@JoinColumn(name = "role_id")},inverseJoinColumns= {
                @JoinColumn(name = "user_id") })

    1. 级联保存(相当于是特殊的多对多)

        a)       定义:只用持久化一方的数据就会把多方数据保存到数据库,本质就是只调用一次persistence方法来保存一方。

        b)       @ManyToMany(cascade = CascadeType.PERSIST)   cascade = CascadeType.PERSIST属性表示该保存方式是一个级联保存,可以在其中一个实体类上加该注解也可以在多个实体类上加该注    解,在保存数据的时候只用保存一个实体对象的数据就行了。

    1. 一对一

        a)       关联外键方式:@OneToOne   @JoinColumn(name = "qq_id", unique = true)   unique = true确表是一对一的关系,@OneToOne(optional = false) optional表示该字段能否为空

        b)       共享主键

  • 相关阅读:
    长为N的数组,元素范围是0-N-1,其中只有一个数是重复的,找出这个重复元素
    KMP算法
    最长公共子序列,最长公共字串,最长递增子序列
    马走日字问题
    URL详解
    分辨率、像素和PPI
    输入一棵二叉树,判断该二叉树是否是平衡二叉树。
    返回值递归问题
    图像几何变换:旋转,缩放,错切
    数据库事务的四大特性以及事务的隔离级别
  • 原文地址:https://www.cnblogs.com/8888-lhb/p/11244164.html
Copyright © 2011-2022 走看看