Java EE - GUI 中的实体管理

Java EE - Entity management in GUI

我在 Java EE 企业应用程序中使用 JPA 和 JTA,包括一个 ejb 和一个包含与网页相关的托管 bean 的 Web 模块。

托管 bean 应该能够通过我的 ejbs 提供的方法从数据库中检索实体。

我有一个 User 实体,表示系统中注册用户的数据,我想允许用户修改他的电子邮件、密码和其他一些设置。

例如让我们考虑这个实体(从所有在这里没有影响的因素中抽象出来):

@Entity
public class User {
..........
    private string email;
    *getter and setter for email*
    private string city;
    *getter and setter for city*
..........
}

在我的网络模块中,我有 xhtml 文件通过表达式语言引用托管 bean。

例如我可能在 Index.xhtml

<someEditableTag>#{myBean.user.email}</someEditableTag>
<someEditableTag>#{myBean.user.city}</someEditableTag>
<someButton>#{myBean.user.confirm()}</someButton>

然后在我的豆中:

@Managed
@RequestScoped
public class myBean {
..........
   private user;
   public getUser() {
     if(user == null)
       user = someEJB.getLoggedUser(); // Retrieve from DB the user entity associated to logged user
     return user;
   }
   public void confirm() {
   // Call some ejb method to update the settings of the user in the database with the new data on the page
   }
..........
} 

我的问题是,如果可编辑字段在持久性上下文中引用我的实体,当我在页面上编辑数据时,这不应该以某种方式触发更新吗?不完全是在我编写数据时,但编辑后的数据通过 xhtml 中的表达式语言引用了我的实体。

简而言之,如果托管实体中的更改是自动提交的,我担心托管 bean 可以通过从我的 ejb return 访问实体的 setter 来修改数据库中的实体而不是使用调用某些 ejb 方法的确认函数。

我对这些工具有很多不了解,所以我想就我刚才提到的这个疑问征求您的意见。

我考虑了一些解决方案,例如在将 ejb 中的实体传递给托管 bean 之前分离它们,但这似乎不是一个好的解决方案。我想知道这类问题的标准设计模式是什么。任何解决方案示例都可以正常工作。

非常感谢任何帮助, 提前谢谢你

直到您不会从 EntityManager on your entity, nothing should happen in DB. You can always refresh your entity with EntityManager 执行 mergeinsert 方法。但是,如果你害怕在你的 web 轮胎中使用实体,你总是可以使用 DTO 模式。