当前位置: 首页 > 面试题库 >

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

翟宏放
2023-03-14
问题内容

我有点困惑。问题是标题,这就是为什么我要问。我在单个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用户/线程尝试读取该瞬态值时,我期望什么输出:

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

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


问题答案:

如果find(..)在同一会话中(即,在同一entitymanager生存期内)调用,则将返回相同的对象引用。的文档find()指定了以下内容:

如果实体实例包含在持久性上下文中,则从那里返回它。

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

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



 类似资料:
  • 问题内容: 我有两个实体。一个继承自另一个。 例: 当我在EntityManager上使用现有汽车ID调用find()时,如下所示: 我得到了一个代理对象,但是我需要访问CarEntity类的特殊方法,因为我想设置一些新参数。 有人可以帮我吗? 当然,这只是一个示例问题。更具体地说:在调用find之后,我正在检查返回对象的实例,如果它是“ CarEntity”,则我设置参数,否则,我什么也不做。除

  • 问题内容: 我希望能够通过在已实例化的对象上调用方法来创建对象的新实例。例如,我有一个对象: 我希望能够调用并拥有两个有机体类型的对象。此时我的方法如下所示: 并且我非常确定它不起作用(我甚至不确定如何测试它。我在本文中尝试了gc方法)。那么,如何使我的对象创建自己的副本,就像我创建的第一个对象(带有)一样,该副本是可访问的? 问题答案: 另一个选项-如果方法中未使用实例(): 这样可以确保生物产

  • 问题内容: 在Python中,我希望能够创建一个既充当类函数又充当实例方法的函数,但是具有更改行为的能力。用例是针对一组可序列化的对象和类型。举个例子: 我知道给定Python源中funcobject.c中classmethod()的定义,这看起来像使用C模块一样简单。有没有办法从python内部执行此操作? 谢谢! 有了描述符的提示,我可以使用以下代码来做到这一点: 谢谢亚历克斯! 问题答案:

  • 我写了一个简单的控制台应用程序,它使用JPA连接到MySQL数据库。数据的实际读写工作正常,但日志记录似乎被搞砸了。我创建的每个EntityManager实例似乎都将自己的log4j appender添加到控制台。因此,由于我的应用程序中有三个实体管理器实例,除了我想要的“真实”控制台输出行之外,我的控制台输出中还有三行额外的行。这里有一个例子。第一行来自我的“真正的”附件,另外三行似乎来自实体管

  • 给定一个包含一组成员的类,每个成员都有自己的getter/setter/etc方法,有没有办法设计一个切入点,当包含在父类中时,该切入点只在成员的方法上触发? 例如: 如果我想创建一个切入点来建议myList。add(),是否有方法执行此操作?我不想通知所有ArrayList。add()调用。仅限于收集。是MyClass成员的add()。 我尝试过在和中使用

  • 问题内容: 我已经使用以下静态方法实现了util类: 我的理解是JAXB Marshaller和StringWriter都是线程安全的……但是我想再次确认是否实现了这样的静态方法,并且有多个线程同时调用objToXml方法,是否有任何潜在的问题? 问题答案: 是的,如果计划使用多线程,则必须每次都创建一个新的。 请参阅非官方的JAXB指南 JAXBContext类是线程安全的, 但是Marshal