- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我遇到了一种情况(我认为这很奇怪,但可能很正常),我使用 EntityManager.getReference(LObj.getClass(), LObj.getId()) 来获取数据库实体,然后通过返回的对象被持久化到另一个表中。
所以基本上流程是这样的:
class TFacade{ createT(FObj, AObj) { T TObj = new T(); TObj.setF(FObj); TObj.setA(AObj); ... EntityManager.persist(TObj); ... L LObj = A.getL(); FObj.setL(LObj); FFacade.editF(FObj); }}@TransactionAttributeType.REQUIRES_NEWclass FFacade{ editF(FObj){ L LObj = FObj.getL(); LObj = EntityManager.getReference(LObj.getClass(), LObj.getId()); ... EntityManager.merge(FObj); ... FLHFacade.create(FObj, LObj); }}@TransactionAttributeType.REQUIREDclass FLHFacade{ createFLH(FObj, LObj){ FLH FLHObj = new FLH(); FLHObj.setF(FObj); FLHObj.setL(LObj); .... EntityManager.persist(FLHObj); ... }}
我收到以下异常“java.lang.IllegalArgumentException:未知实体:com.my.persistence.L$$EnhancerByCGLIB$$3e7987d0”
研究了一段时间后,我终于发现是因为我使用了 EntityManager.getReference() 方法,所以我得到了上述异常,因为该方法正在返回一个代理。
这让我想知道,什么时候最好使用 EntityManager.getReference() 方法而不是 EntityManager.find() 方法?
EntityManager.getReference() 如果找不到正在搜索的实体,则抛出 EntityNotFoundException,这本身就很方便。 EntityManager.find() 方法仅在找不到实体时返回 null。
关于事务边界,在我看来,您需要在将新找到的实体传递给新事务之前使用 find() 方法。如果您使用 getReference() 方法,那么您可能最终会遇到与我类似的情况,但上述异常除外。
最佳答案
当我不需要访问数据库状态时,我通常使用 getReference 方法(我的意思是 getter 方法)。只是为了改变状态(我的意思是setter方法)。如您所知,getReference 返回一个代理对象,该对象使用称为自动脏检查的强大功能。假设如下
public class Person {
private String name;
private Integer age;
}
public class PersonServiceImpl implements PersonService {
public void changeAge(Integer personId, Integer newAge) {
Person person = em.getReference(Person.class, personId);
// person is a proxy
person.setAge(newAge);
}
}
如果我调用 find 方法,JPA 提供者会在后台调用
SELECT NAME, AGE FROM PERSON WHERE PERSON_ID = ?
UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?
如果我调用 getReference 方法,JPA 提供者会在后台调用
UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?
你知道为什么???
当你调用 getReference 时,你会得到一个代理对象。像这样的东西(JPA 提供者负责实现这个代理)
public class PersonProxy {
// JPA provider sets up this field when you call getReference
private Integer personId;
private String query = "UPDATE PERSON SET ";
private boolean stateChanged = false;
public void setAge(Integer newAge) {
stateChanged = true;
query += query + "AGE = " + newAge;
}
}
所以在事务提交之前,JPA 提供者将看到 stateChanged 标志以更新 OR NOT 个人实体。如果 update 语句后没有更新任何行,JPA 提供程序将根据 JPA 规范抛出 EntityNotFoundException。
问候,
关于java - 何时将 EntityManager.find() 与 EntityManager.getReference() 与 JPA 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607532/
使用实体管理器 getReference()或 find()方法为数据库的某些记录返回一个未初始化的对象。你知道为什么以及应该做什么吗? 最佳答案 getReference()如果尚未加载对象,则不会
类似https://stackoverflow.com/a/12828955/3395716的答案和 https://stackoverflow.com/a/32184186/3395716许多其他人
情况: 我想使用 getReference() doctrine2 实体管理器的功能。但是,在我请求一个已从数据库中删除的对象的情况下,如果我多次请求同一对象,我会获得一个代理。 示例: //A ra
我想知道 database.getReference("foo/bar/123") 和 database.getReference("foo").child("bar").child 有什么区别("1
我正在尝试将 war 文件部署到 Wildfly 10.0.0.Final 中,部署失败并出现以下错误: "{\"WFLYCTL0080: Failed services\" => {\"jboss.
我正在尝试访问 shrubs 子项,并在 shrubs 下的每个唯一键下访问键值对,例如键:ShrubbedWord 值:yfyj 我已经尝试过,但我什么也没得到:- postsData = Fire
我有一个 JPAController 类,它具有创建方法来在父表和详细表中保存记录。两个表中的主键均为 BigDecimal 类型,小数位数为 8,精度为 15。现在我的问题是,当我调用 create
在 Hibernate 4.3 中,session 中的 load() 返回延迟加载的代理对象,而 get() 返回对象(如果存在)或者 null 如果没有。但是here和 here它提到 getRe
希望你能帮我解决我的错误。我仍在开发我的登录应用程序,直到现在该应用程序运行良好,尽管存在一些小错误。到目前为止,用户可以登录、登录和更改他的个人资料信息。在最后的步骤中,我还实现了删除用户信息的功能
我在应用程序启动时在生产版本中获得 NPE,并且在使用 adb 重新安装后仅获得一次 NPE。 Caused by java.lang.NullPointerException Attempt to
伙计们,我非常想知道如何将 EntityManager.getReference 与超过 1 个主键一起使用,因为当我想要更新数据时总是会出现错误,错误消息有点像: [EL Fine]: sql: C
我的问题涉及 EntityManager.getReference。鉴于我在一个 JPA session 中,我能否确定对于同一实体和同一主键的 EntityManager.getReference
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭去年。 Improve th
我正在使用 JPA EntityManager.getReference(Class clazz, Integer pk)。我知道 pk 值设置为 1,但在该方法返回的对象中,该值仍然设置为零。我不明
我发现自己很难在 Spring Data JPA 中实现可自定义的方法。例如,我有一个 Pet 类,它有一个所有者(多对一关系)。如果我有一个方法到 save(Pet pet, int ownerId
我正在尝试请求服务。 这是 wsdl 文件的链接 WSDL 代码如下 $client = new SoapClient("http://zelsoft.ru/intourxml_v2/BookingS
有什么区别 T EntityManager.find(Class entityClass, Object primaryKey) and T EntityManager.getReference(
我认为有两种通用方法可以通过 BeanManager 获取自动创建的 CDI 托管 bean 实例。当只有 Bean 时首先(基于 Class 创建): 作者: BeanManager#getRefe
应用程序抛出空错误,尝试了一些方法但没有运气,看起来很简单,但我一生都无法弄清楚,不确定我错过了什么。希望有人能看到这个问题。 ** 日志 ** RouteToMarketSearch.RouteTo
我使用 Hibernate 5.2.11 作为 JPA 提供程序。我有一个带注释的类 (PurchaseOrder) 和另一个带注释的类 (Customer) 作为具有多对一关系的字段。但因为遗留代码
我是一名优秀的程序员,十分优秀!