设置是这样的:
前端: 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()
方法必须作为RequestFactory
flow 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);
}
}