保存实体之前避免选择Spring Data JPA

时间:2019-06-20 08:39:22

标签: java spring hibernate jpa spring-data-jpa

在这种情况下,我正在使用Spring Data JPA JpaRepository保存一个实体(我们称其为CG实体)。在这个CG实体中,我们有许多实体One-One,One-Many和M-M,并且在这些实体内部,存在更多的关系,依此类推。我通过它的主键设置CG实体,并向其添加其他实体对象。因此,基本上,此CG实体PK应该用作CG内部大多数其他实体的FK。

某些实体是新实体,而其他实体是通过使用给定的主要ID创建对象来设置的(因此,无需使用相关存储库来查找和设置对象)。在模型类中,所有主键都是手动设置的(没有自动生成策略)(我不能公开表结构,因为我不允许这样做) 当我调用.save()函数时,JPA运行此函数

    @Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

春季,JPA通过创建选择查询来检查CG是否是新实体。当我使用调试器中显示的SQL查询时,我观察到它使用了将近70个SELECT查询。 在春季文档Persistable中,我实现了它并将覆盖isNew()设置为false。对于由PK创建的那些对象,我做了同样的事情。

但是,当我为整个操作调用.save()时,spring数据JPA在插入之前会运行近800个SELECT查询,并且有70个INSERT查询(插入查询没有问题) 。保存条目大约需要20秒钟。我提到了与该场景相关的许多线程,但找不到很好的SPRING DATA JPA解决方案。 (因此Thread 1) 我需要做的只是减少保存CG实体的时间。是否有任何Spring数据JPA方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

好的,通过执行以下操作可以克服这一点;

  1. 设置FetchType

    需要将所有FetchType设置为FetchType.LAZY。在我的模型中,其中一些缺失。没有添加Fetchtypes。因此,对所有@OneToMany关系的介绍都是

  2. 启用交易

    以前,在Spring Web应用程序中,未启用事务。通过使用@EnableTransactionManagement启用了此功能,相关的服务方法注释为@Transactional

通过上述操作,我可以使保存条目所需的时间最少。现在,在2-4秒内运行了近200-300个查询。

PS:始终为懒惰设置FetchTypes