gpt4 book ai didi

java - 如何暂时禁用Hibernate实体版本检查?

转载 作者:行者123 更新时间:2023-11-30 03:23:12 25 4
gpt4 key购买 nike

我有一个显示所有联系人的页面。这只是只读页面,我所做的就是遍历某个组的所有联系人并显示它们:

//Not lazy load of contacts, I cannot use lazy loading
List<Contact> contacts = someService.getContacts(groupId);

for (Contact contact : contacts) {
//add contact properties to the model to be displayed later
}

同时,我可能有一个单独的后台线程来更新其中一个联系人。该线程更新了一个我不会显示的字段,因此在这种情况下我完全可以接受数据不同步。

问题是 Hibernate 将更新联系人的版本号并将其提交到我的数据库(当后台线程完成时)。因此,当我的 for 循环遇到这样的对象时,将引发以下异常。

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

这完全没问题。有没有办法在 Hibernate 集合的迭代过程中禁用对象的版本检查?当我说禁用时,我的意思是在这个特定的场景中,在这个特定的 for 循环中?但其他情况则不然。

我认为发生这种情况是因为底层集合是AbstractPercientCollection,并且它的迭代器将检查每个成员的版本与相应的数据库值。

最佳答案

您无法在 session 的基础上禁用乐观锁定,但有一些替代方法可以处理这种情况:

  1. 您可以切换到versionless optimistic locking
  2. 您可以将多个实体片段映射到同一个表,并且您可以拥有一个仅包含特定业务案例所需的列且没有版本的片段。这样您就可以绕过常规实体乐观锁定检查。

关于java - 如何暂时禁用Hibernate实体版本检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30839413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com