【问题标题】:Java EE - Entity management in GUIJava EE - GUI 中的实体管理
【发布时间】:2023-03-13 18:26:01
【问题描述】:

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

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

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

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

@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>

然后在我的 bean 中:

@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 返回的实体的设置器来修改数据库中的实体调用某些 ejb 方法的函数。

我对这些工具有很多不了解的地方,所以我想听听您对我刚才提到的这个疑问的看法。

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

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

【问题讨论】:

    标签: jakarta-ee jpa ejb managed-bean jta


    【解决方案1】:

    除非您不会在您的实体上从EntityManager 执行mergeinsert 方法,否则数据库中不会发生任何事情。您可以随时使用EntityManager 刷新您的实体。但是,如果您害怕在 web 轮胎中使用实体,则始终可以使用 DTO 模式。

    【讨论】:

    • 感谢您的回答,我会检查 DTO 模式是否适合我的目的。至于你答案的第一部分,为什么要这样工作?我的意思是,在我的一个测试中,我有一个托管 bean,称为无状态 ejb 的方法,它使用数据库中已经存在的托管实体的设置器,而无需从 EntityManager 调用合并。一旦 ejb 的方法终止,更改就会实际提交给数据库。这是否意味着对于无状态 bean,实体更改会自动提交,但对于 Managed,RequestScoped 则不会?
    • 我不是专家,但我认为在 JSF ManagedBean 和 EJB bean 中调用实体的 settter 是一个不同的问题。他们的 EJB 在 dirrerent Container 中运行,然后在 Managed JSF bean 中运行。 EJB 中的每个操作,如果没有像 RuntimeException 这样的特殊情况发生(只要您在persistance.xml 中的事务管理器设置为 JTA)以提交到 DB 结束。但是,JSF ManagedBean 没有这种行为。
    • 完美,我想这实际上可以解决我的问题。你有什么链接可以让我了解这些行为吗?感谢您的帮助
    • 没有任何特定链接,但请阅读 EJB Container(例如在 Wiki 中)。你也可以从这个docs.oracle.com/javaee/6/tutorial/doc/bnabo.html开始
    • 其实我现在正在阅读,非常感谢您的帮助!
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多