java – EntityManager的find()方法是否创建了JPA类的新实例?

我有点困惑.问题在于标题,这就是我要问的原因.
我在单个VM上运行JSF JPA Web应用程序.
JPA课程有@Transient字段.现在想象一些Web用户打开一些页面并执行下面的代码

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

当另一个Web用户/线程尝试读取该瞬态值时,我应该期望什么输出:

// method 2 in backing bean
Agent a = entityManager.find(Agent.class, "007");
String val = a.getTransientValue();

换句话说,就JVM而言,find()方法总是返回新的类实例或相同或“它取决于”?我已经通过JSR-220查找答案,没有成功,任何帮助或文档参考将不胜感激.

最佳答案
如果在同一会话中调用find(..)(即在相同的entitymanager生命周期内),则将返回相同的对象引用. documentation of find()指定了这个:

If the entity instance is contained in the persistence context, it is returned from there.

换句话说,EntityManager拥有一个实体的集合(最有可能映射).当你调用find时,它会检查该集合.如果在那里找不到实体,则对数据库进行查询.返回的实体被放入地图中,因此后续调用将在那里找到它.

但请再次注意,这仅适用于一个会话的范围.这通常与一个http请求相同(在Web应用程序上下文中)

转载注明原文:java – EntityManager的find()方法是否创建了JPA类的新实例? - 代码日志