我有点困惑。问题是标题,这就是为什么我要问。
我在单个VM上运行了JSF + JPA Web应用程序。
JPA类具有@Transient字段。现在想象一下某个网络用户打开了一个页面并执行下面的代码

import javax.persistence.EntityManager;
// method 1 in backing bean
Agent a = entityManager.find(Agent.class, "007");
a.setTransientValue("Aston Martin");

当另一个Web用户/线程尝试读取该 transient 值时,我期望什么输出:
// method 2 in backing bean
Agent a = entityManager.find(Agent.class, "007");
String val = a.getTransientValue();

换句话说,就JVM而言,find()方法是否总是返回新的类实例或相同或“取决于”的实例?我一直在寻找通过JSR-220的答案,但没有成功,任何帮助或文档引用将不胜感激。

最佳答案

如果在同一 session 中(即,在同一entitymanager生命周期内)调用find(..),则将返回相同的对象引用。 documentation of find() 指定了以下内容:



换句话说,EntityManager拥有实体的集合(最有可能映射)。当您调用find时,它将检查该集合。如果在该位置找不到该实体,则会查询数据库。返回的实体将放入 map 中,因此后续调用将在此处找到它。

但请再次注意,这仅适用于一个 session 的跨度。这通常与一个http请求相同(在Web应用程序上下文中)

09-27 00:40
查看更多