gpt4 book ai didi

当实体没有改变时,Hibernate 在刷新期间是持久化实体

转载 作者:行者123 更新时间:2023-12-01 13:06:25 25 4
gpt4 key购买 nike

我遇到了一个问题,实体管理器保留了一个我认为在刷新期间没有改变的实体。

我知道以下代码是问题所在,因为如果我将其注释掉,实体就不会存在。在这段代码中,我所做的只是加载实体并调用一些 getter。

Query qry = em.createNamedQuery("Clients.findByClientID");
qry.setParameter("clientID", clientID);

Clients client = (Clients) qry.getSingleResult();

results.setFname(client.getFirstName());
results.setLname(client.getLastName());
...
return results;

稍后在另一种方法中,我执行另一个 namedQuery 导致实体管理器刷新。由于某种原因,上面加载的客户端被持久化。

这是一个问题的原因是因为在所有这些中间,有一些旧代码正在对客户端进行一些直接的 JDBC 更改。当实体管理器持久化时,直接 JDBC 所做的更改将丢失。

我们目前的理论是实体管理器正在将实体与基础记录进行比较,发现它不同,然后将其持久化。

有人可以解释或确认我们看到的行为吗?

最佳答案

我不知道 hibernate 的内部结构,但我的猜测是你是对的。但我不认为 hibernate 与 db 相比,而是与本地 session 缓存相比。

您可以通过将对象设置为 readOnly 来避免该问题 - hibernate 然后不检查更改,例如

   session.setReadOnly(client, true);

或者,您也可以使用 Session.evict() 驱逐对象。下次需要该对象时,将从数据库中读取它,包括您使用自定义 JDBC 所做的任何更改。

关于当实体没有改变时,Hibernate 在刷新期间是持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861776/

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