【发布时间】:2010-05-18 23:06:22
【问题描述】:
我遇到了一个问题,即实体管理器正在持久化一个我认为在刷新期间没有改变的实体。
我知道以下代码是问题所在,因为如果我将其注释掉,实体就不会存在。在这段代码中,我所做的只是加载实体并调用一些 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 所做的更改将丢失。
我们目前的理论是,实体管理器将实体与基础记录进行比较,发现它不同,然后将其持久化。
有人可以解释或确认我们看到的行为吗?
【问题讨论】: