美文网首页
SpringData(3)

SpringData(3)

作者: dwwl | 来源:发表于2019-04-07 20:37 被阅读0次

mappedBy声明于关系的被维护方,声明的值为关系的维护方的关系对象属性名。
在实例中,mappedBy被声明于Course类中,其值为Student类中的Set对象"courses"。即,Student为关系维护方,Course为被维护方。
动态查询:

注意:gt ge like ...注意类型转换 as

一个小规范:
    实体类中的集合属性  最好再实体类中先初始化,防止脑残 空指针

一对多:一的房会维护外键,从表维护外键不会发送多余sql

放弃维护外键:提高效率

多对多放弃维护权:

被动一方放弃

Demo:
一对多:
描述:Custom与LinkMan的关系:一对多;

主要的配置:

LinkMan.java

 @ManyToOne(targetEntity = Custom.class)
    @JoinColumn(name = "linkman_custom_ref" ,referencedColumnName = "cust_id")
    private Custom custom;
    
Custom.java

    @OneToMany(mappedBy = "custom")
    private List<LinkMan> linkManList = new ArrayList<>();
    
  测试方法:
    @org.junit.Test
    @Transactional
    @Rollback(false)
    public void test_create(){
            LinkMan linkMan = new LinkMan();
            Custom custom = new Custom();
            custom.setCustName("changSieTest");
            linkMan.setLkmName("changSie");
            custom.getLinkManList().add(linkMan);
            linkMan.setCustom(custom);
            customerDao.save(custom);
            linkManDao.save(linkMan);
    }
    
    
    个人理解:
    原生sql中,一对多关系的生成依靠多的那一方(本例中的linkMan)建立外键.所以 @ManyToOne和@JoinColumn中的referencedColumnName,表明了外键指向的位置,@JoinColumn的name指定了外键的名字.
    当linkman不指定custom对象时,执行调用没有问题,
    当linkman中指定custom对象时,只调用linkManDao中的save方法,会报错
    个人理解是,当linkman中有对应custom,必须将custom对象也保存到数据库才符合正常逻辑,
    
    另外,在执行保存操作时,先保存一的,在保存多的,否则还会有一次update语句的执行,原因是多的先执行没有外键值,应该是框架再执行 customerDao.save(custom);时,把返回的id付给了custom对象
    

级联配置:

只需要再@OneToMany注解中添加cascade = CascadeType.ALL, 但是级联操作太危险,所以一般不用

一对多比较标准的写法:
两端都配置

custom.java
    @OneToMany(targetEntity = LinkMan.class,cascade = CascadeType.ALL)
    @JoinColumn(name = "linkman_custom_ref" ,referencedColumnName = "cust_id")
    private List<LinkMan> linkManList = new ArrayList<>();
    这样的配置执行时,拥有外键权,会执行update,不用update,把@JoinCloumn删掉,再@oneToMany()mappedBy
  其实测试感觉不写mappedBy也可以,只要把@JoinColumn删掉就可以  
linkMan.java
    @ManyToOne(targetEntity = Custom.class)
    @JoinColumn(name = "linkman_custom_ref" ,referencedColumnName = "cust_id")
    private Custom custom;
    
    

多对多:

情形:user和role是多对多的关系

User.java

 @ManyToMany(targetEntity = Role.class)
    @JoinTable(name = "user_role_ref",
            inverseJoinColumns= {@JoinColumn(name = "sys_role_id",referencedColumnName = "id")},
            joinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "id")}
    )

Role.java

@ManyToMany(targetEntity = User.class)
@JoinTable(name = "user_role_ref",
            joinColumns = {@JoinColumn(name = "sys_role_id",referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "id")}
    )
    List<User> users = new ArrayList<>();
    

上面两个类都这么配置的时候,会多执行一次向中间表插入数据,

这会导致两种结果:没有组成联合主键的时候,插入两次重复数据

​ 有联合主键,报错

所以多对多的表必须有一方放弃维护外键,删除@JoinTable,@ManyToMany(mappedBy = "users")

注意多对多时,可能会出现StackOverFlow,原因是我两个类中执行了打印,用到了所以会继续查询,导致溢出

对象导航查询:

查多的,默认是延迟查询

查少的,默认是立即查询,

默认的很符合日常开发,不需要更改

相关文章

  • SpringData(3)

    mappedBy声明于关系的被维护方,声明的值为关系的维护方的关系对象属性名。在实例中,mappedBy被声明于C...

  • ES学习笔记4

    ES与其他架构配合使用 springdata、spark、flink +es springdata (不想记 懒得...

  • springdata

    介绍三种操作数据库的对比 第一种直接JDBC 思路:写个工具类,获取连接的方法,释放资源的方法 实现:pom.xm...

  • 学习笔记

    1. SpringData JPA只是SpringData中的一个子模块。JPA是一套标准接口,而Hibernat...

  • SpringData 完全入门指南

    SpringData 笔记 1. 配置项目 1.pom.xml 2.bean.xml 3.实体类 这里注意的一点就...

  • SpringData JPA

    一、概述 1. SpringData 概述 Spring Data : Spring 的一个子项目。用于简化数据库...

  • springdata jpa

  • Springdata(2)

    今日复明日 明日何其多啊,要想改变就从现在开始吧 面向接口开发:(前后端分离开发) 1 通用性 重用性高 2...

  • SpringData(1)

    Demo 利用create 生成表时,不设置l属性ength 生成表中的长度为255 单例:1 构造方法私有 主键...

  • SpringData分析

    学习ORM思想启发 1 建立实体类与表中的关系 2 建立实体类中属性和表中字段关系 学习ORM思想 2.1 orm...

网友评论

      本文标题:SpringData(3)

      本文链接:https://www.haomeiwen.com/subject/usreiqtx.html