EJB实体不会从EntityManager刷新

时间:2013-04-26 20:04:26

标签: java jpa ejb

所以我正在开发一个webapp,我试图使用JPA来访问我的数据库。我使用EJB从我的数据库中获取实体,但是,如果我从EJB获取另一个实例并对其进行更改,则更改不会反映在我的旧实体中。此外,当我尝试刷新我的旧实体时,我收到一个错误,指出实体未被管理。我可以设计一个工作,我只是想知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

好的,看起来如下。

EJB + JPA位于EJB容器中。您的Web应用程序位于Web应用程序容器中。这两个容器都是应用程序服务器的一部分,但它们的通信就好像Web Containter只是一个EJB组件客户端。

所以,基本上,你有典型的客户端(Web应用程序) - 服务器(EJB + JPA)场景。

现在,如果您将实体从EJB带到客户端,它不知道在服务器上所做的更改 - 它只是客户端上的普通对象(它“忘记”其EJB / JPA源)。这就是为什么即使您在EJB容器中更改模拟实体,也看不到Web应用程序中的任何更改。

您必须手动同步客户端对象和EJB容器中保存的对象。

第二个问题 - 实体未受管理。当您将实体从客户端发送到EJB容器时,EJB容器不会对该实体做任何假设 - 它将其视为普通对象。

为了告诉EJB容器“嘿,看,那个实体不只是一些随机对象,它是我希望你管理的实体”,你需要在进一步做之前调用那个对象EntityManager.merge(entity)方法动作。

此方法将实体添加到持久性上下文缓存,并返回附加到实体管理器会话的对象。

这很重要!您需要修改正确的对象

Object addedToEM = EntityManager.merge(entity)

如果要在服务器端进行任何更新,则需要修改addedToEM实体(有关详细说明,请参阅例如JPA EntityManager: Why use persist() over merge()?)。