我希望在我的应用程序(spring data、hib)中全局禁用脏检查,我的目标是只有当我显式调用myRepo.save()
或myRepo.myUpdateQuery()
时,JPA才会生成更新/插入查询。
我所有的实体都有final字段和不可修改的集合,所以我真的不需要脏检查,我总是显式地处理更新。
尽管如此,我还是遇到了大量的性能问题,因为JPA在每次延迟加载字段时都会生成冗余的更新查询。
到目前为止我看到的解决方案(未成功):
- 使用FlushMode=MANUAL。这是一个大材小用,因为我必须确保手动调用
flush()
。巨大的重构我负担不起。 - 使用只读事务。这也会阻止我显式的保存/修改查询调用。我希望那些继续工作。
- 分离实体。这会有额外的副作用,比如不能执行进一步的延迟加载,这是一个不可行的。而且,它需要大量的重构。在大多数情况下,我甚至没有访问EntityManager的权限,因为我使用的是spring数据仓库。
- 使用无状态会话。不是一个选项,因为像惰性加载这样的功能也会被禁用。
1条答案
按热度按时间xxhby3vn1#
使用FlushMode=MANUAL。这是一个大材小用,因为我必须确保手动调用flush()。我无法承受巨大的重构。
如果你不想这么做,那么如果你还需要延迟加载的话,你也没什么办法。也许你可以以只读的方式加载实体(参见
org.hibernate.Session#setReadOnly
和org.hibernate.Session#setDefaultReadOnly
),然后将它们升级为可变的,但是这同样需要像显式调用flush
一样调用显式方法。不过,我可以从过去的项目中告诉您,重构是非常值得的,以确保服务层之外不会发生延迟加载。
也许像Blaze-Persistence Entity-Views这样的DTO方法正是您正在寻找的?默认情况下它是只读的,但您可以根据需要将只读数据转换为可更新类型,以模拟您的写入问题。