【发布时间】: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