hibernate 休眠禁用脏检查

js4nwp54  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(156)

我希望在我的应用程序(spring data、hib)中全局禁用脏检查,我的目标是只有当我显式调用myRepo.save()myRepo.myUpdateQuery()时,JPA才会生成更新/插入查询。
我所有的实体都有final字段和不可修改的集合,所以我真的不需要脏检查,我总是显式地处理更新。
尽管如此,我还是遇到了大量的性能问题,因为JPA在每次延迟加载字段时都会生成冗余的更新查询。
到目前为止我看到的解决方案(未成功):

  • 使用FlushMode=MANUAL。这是一个大材小用,因为我必须确保手动调用flush()。巨大的重构我负担不起。
  • 使用只读事务。这也会阻止我显式的保存/修改查询调用。我希望那些继续工作。
  • 分离实体。这会有额外的副作用,比如不能执行进一步的延迟加载,这是一个不可行的。而且,它需要大量的重构。在大多数情况下,我甚至没有访问EntityManager的权限,因为我使用的是spring数据仓库。
  • 使用无状态会话。不是一个选项,因为像惰性加载这样的功能也会被禁用。
xxhby3vn

xxhby3vn1#

使用FlushMode=MANUAL。这是一个大材小用,因为我必须确保手动调用flush()。我无法承受巨大的重构。
如果你不想这么做,那么如果你还需要延迟加载的话,你也没什么办法。也许你可以以只读的方式加载实体(参见org.hibernate.Session#setReadOnlyorg.hibernate.Session#setDefaultReadOnly),然后将它们升级为可变的,但是这同样需要像显式调用flush一样调用显式方法。
不过,我可以从过去的项目中告诉您,重构是非常值得的,以确保服务层之外不会发生延迟加载。
也许像Blaze-Persistence Entity-Views这样的DTO方法正是您正在寻找的?默认情况下它是只读的,但您可以根据需要将只读数据转换为可更新类型,以模拟您的写入问题。

相关问题