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