spring jpa

最后发布时间:2021-05-05 21:20:04 浏览量:

懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用。其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句,抽取相关联数据。而实时加载则是执行完主查询后,不管是否被引用,立马执行后续的关联数据查询。社区里有人认为懒加载这种功能比较鸡肋,这种事仁者见仁,智者见智啦,个人觉得依自己业务场景而定。

顺带说一句,使用懒加载来调用关联数据,必须要保证主查询session(数据库连接会话)的生命周期没有结束,否则,你是无法抽取到数据的。在Spring Data JPA中如何自己控制session的生命周期

多对一映射

  • 关系字段上加注解@ManyToOne
  • 如果是n-1,那么默认fetch=eager,采用立即查询
  • 在 many 方指定 @ManyToOne 注释,并使用 @JoinColumn 指定外键名称
  private Grade grade;
    @JoinColumn(name="grade_id")
    @ManyToOne(fetch=FetchType.LAZY)
    public Grade getGrade() {
        return grade;
    }
@Test
    public void testManyToOne(){

        Grade grade=new Grade();
        grade.setName("ok");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good");
        student.setGender(1);
        student.setEmail("7879");
        //设置关联关系
        student.setGrade(grade);

        student1.setName("gdd");
        student1.setGender(1);
        student1.setEmail("78de79");
        //设置关联关系
        student1.setGrade(grade);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);

    }

一对多映射

  • 关系字段上加注解 @OneToMany
  • 如果是1-n,默认是延迟加载策略,可以通过改变fetch属性来改变
//这时候要去掉joinColumn
@OneToMany(fetch=FetchType.EAGER,mappedBy="grade")
    public Set<Student> getStudent() {
        return student;
    }
    @JoinColumn(name="grade_ids")
    @OneToMany(fetch=FetchType.EAGER)
    public Set<Student> getStudent() {
        return student;
    }
//测试,这时候只有三条insert语句    
    @Test
    public void TestOneToMany(){

        Grade grade=new Grade();
        grade.setName("juewei");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good1");
        student.setGender(1);
        student.setEmail("7879");


        student1.setName("good2");
        student1.setGender(1);
        student1.setEmail("78de79");


        //设定关系
        grade.getStudent().add(student1);
        grade.getStudent().add(student);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);


    }

双向一对多映射

  • 双向一对多关系中,必须存在一个关系维护端,在 JPA 规范中,要求 many 的一方作为关系的维护端(owner side), one 的一方作为被维护端(inverse side)。
  • 可以在 one 方指定 @OneToMany 注释并设置 mappedBy 属性,以指定它是这一关联中的被维护端,many 为维护端。
  • 在 many 方指定 @ManyToOne 注释,并使用 @JoinColumn 指定外键名称
@Test
    public void TestOneToManyBetween(){

        Grade grade=new Grade();
        grade.setName("juewei");

        Student student =new Student();
        Student student1 =new Student();

        student.setName("good1");
        student.setGender(1);
        student.setEmail("7879");
        student.setGrade(grade);

        student1.setName("good2");
        student1.setGender(1);
        student1.setEmail("78de79");
        student1.setGrade(grade);

        //设定关系
        grade.getStudent().add(student1);
        grade.getStudent().add(student);

        entityManager.persist(grade);
        entityManager.persist(student);
        entityManager.persist(student1);
    }

参考

https://blog.csdn.net/qq_33574890/article/details/78881337
https://blog.csdn.net/u011726984/article/details/72625783
https://www.cnblogs.com/mayuan01/p/12006673.html
https://www.cnblogs.com/MrSi/p/8081811.html
https://blog.csdn.net/aq_112700/article/details/105111419
https://blog.csdn.net/larger5/article/details/79823266#t17
https://www.cnblogs.com/huyuchengus/p/13796107.html
https://blog.csdn.net/dandandeshangni/article/details/79456742