其他分享
首页 > 其他分享> > JPA加强(关联关系配置)

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)       共享主键

标签:JoinColumn,name,JPA,配置,单向,关联,SQL,一方,id
来源: https://www.cnblogs.com/8888-lhb/p/11244164.html