ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JPA加强(关联关系配置)

2019-07-25 14:52:21  阅读:255  来源: 互联网

标签:JoinColumn name JPA 配置 单向 关联 SQL 一方 id


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有