设置是这样的:
前端: GWT用于RequestFactory发送数据对象
后端:
Web 层:
GWT注入 EJB 的服务器端代码
EJB 层:
无状态会话 bean:
数据访问 bean ( DAB)=> 注入EntityManager了JPA操作,提供了实体的合并和检索方法
Facade bean ( FB) => 调用 DAB 的方法,是 EJB 和 web 层的接口
当一个实体对象(比如说MyEntity)在客户端修改后要保存时,流程是这样的:
1. 由客户端发起
2. 运行服务器端GWT代码并调用以下方法:
3.find()方法查找MyEntity使用FB.findMyEntity()哪些调用的实例,而DAB.findMyEntity()后者又用于EntityManager进行查找。该find()方法必须作为RequestFactoryflow in的一部分被调用GWT。
4.save()导致FB.saveMyEntity()--> DAB.saveMyEntity()-->EntityManager.merge()并且改变的实体对象被持久化。
很明显,每个find()和save()方法都在不同的JPA事务中运行,这是无效和糟糕的设计。
关于使用简单的查找和保存方法来保持外观 bean 接口:
- 处理这种情况的最佳设计是什么?- 最好在一个
JPA事务中同时调用两个方法。 - 什么是替代品?有利有弊。
编辑:包括 和 的代码的简化FB示例DAB。
门面豆(FB):
@Stateless
public class MyFacadeBean implements MyFacade{
@EJB
private DataAccessBean dab;
@Override
public void saveMyEntity(MyEntity entity) {
dab.saveMyEntity(entity);
}
@Override
public void findMyEntity(int id) {
dab.saveMyEntity(id);
}
}
数据访问 bean ( DAB):
@Stateless
public class DataAccesseBean implements DataAccessBeanInterface{
@PersistenceContext
private EntityManager entityManager;
@Override
public void saveMyEntity(MyEntity entity) {
entityManager.merge(entity);
}
@Override
public void findMyEntity(int id) {
entityManager.find(MyEntity.class,id);
}
}