spring boot JPA 注意的几个问题 (session提前关闭、关联集合属性延迟加载问题、多表查询问题等)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27886997/article/details/84976251

如图1所示,会议提前关闭问题

spring整合hibernate或者spring boot里使用jpa,本质都是hibernate的sesison操作数据库,默认sesison会提前关闭,报延迟加载..异常,要等到后台值返回到视图层之后,才关闭sesison才合理;

spring boot里这样设置即可,延续session到返回视图层

2,多表关联时的延迟加载。

@ManyToMany默认时懒加载的

 @ManyToOne默认立刻加载

 延迟加载的意思就是,查询主体的时候,关联属性先不查询(想法里观察SQL语句就可以确定),直到其第一次被访问,如以下情况可以触发那些延迟属性被加载

1、 System.out.print(tagInfo.getCustomTagList());

2,思想里调试观察实体的变量的值也会触发查询实体里的延迟加载的关联属性

3,把弹簧MVC实体返回给前端页面,要序列化,那些延迟属性也会被触发

所以只能通过观察日志的SQL语句来确认那些延迟属性被查询了!

延迟加载的弊端:

如果业务就需要一下子把实体+集合属性都查询出来,发送一条SQL就够了,如果是延迟加载了,它会发送两条SQL,第一条先查询实体,等到返回视图层,或者用到集合属性的时候,再发送一条SQL查询该属性值,如果几百个人,这就多个几百条SQL

怎么避免延迟加载,避免SQL + 1问题

如图1所示,实体中@ManyToMany这些注解加入取=渴望

2,查询语句有来自甲左连接乙变为来自甲左连接获取乙强制一次性加载

3,通过注解

@Entity
@NamedEntityGraph(name = "graph.Department.employees", 
      attributeNodes = @NamedAttributeNode("employees"))
public class Department {
    // ......
}

总结:

 hinernate jpa查询效率相比mybatis查询效率是低,而且不支持分表分库,但开发效率高,在很多表关联的时候,一定要注意延迟加载问题,不然查询会很慢;

延迟加载也有好处:

在保存,更新,删除的时候,JPA的多对一等,集合属性等,很好用,能自动维护外键;查询的时候,如果就想要实体的基本信息,那些关联属性不想要,可以开启延迟加载,在返回视图层的时候,手动把实体再转化到另一个VO里,避免触发新查询

3,spring boot JPA批量删除

前台传来ids id用逗号隔开,后台删除表格表a其中id为:ids

注意要删除的实体里配置了级联,就不能使用在这种批量删除了,会报错,只能用ID一个个删除,这种支持级联

猜你喜欢

转载自blog.csdn.net/qq_27886997/article/details/84976251