在这种情况下,我正在使用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方法可以实现这一目标?
答案 0 :(得分:0)
好的,通过执行以下操作可以克服这一点;
设置FetchType
需要将所有FetchType
设置为FetchType.LAZY
。在我的模型中,其中一些缺失。没有添加Fetchtypes。因此,对所有@OneToMany
关系的介绍都是
启用交易
以前,在Spring Web应用程序中,未启用事务。通过使用@EnableTransactionManagement
启用了此功能,相关的服务方法注释为@Transactional
通过上述操作,我可以使保存条目所需的时间最少。现在,在2-4秒内运行了近200-300个查询。
PS:始终为懒惰设置FetchTypes