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 执行 merge
或 insert
方法。但是,如果你害怕在你的 web 轮胎中使用实体,你总是可以使用 DTO 模式。
我在 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 执行 merge
或 insert
方法。但是,如果你害怕在你的 web 轮胎中使用实体,你总是可以使用 DTO 模式。