带有JPA和CDI的JSF应用程序后端体系结构
我正在使用JPA和CDI开发JSF应用程序;我使用以下后端体系结构:带有JPA和CDI的JSF应用程序后端体系结构,jsf,jpa,architecture,cdi,Jsf,Jpa,Architecture,Cdi,我正在使用JPA和CDI开发JSF应用程序;我使用以下后端体系结构: 控制器(JSF进程的CDI注释) 服务(要注入控制器和其他服务的CDI注释) DAOs(由EntityManager处理) 我的问题是,EntityManager应该如何处理事务? 例如,事务(我不使用EJB或Deltaspike,因此没有可用的声明性事务)应该由服务层管理(对吗?),但是与其他操作相关的每个数据都应该由DAO处理。那么EntityManager应该注入到哪里呢 此外,EntityManager是否应该是请
- 控制器(JSF进程的CDI注释)
- 服务(要注入控制器和其他服务的CDI注释)
- DAOs(由EntityManager处理)
:DTO/Models,JSF支持bean@RequestScoped
:多步骤工作流,购物车@ConversationScoped
:用户登录凭据@SessionScoped
:整个应用程序共享的数据,缓存@ApplicationScoped
@SessionScoped//会话,应用程序范围也已确定
公共类ServiceImpl实现服务{
@注入
私家道道;
public void createSomething(sometto dto){
//dto->实体转换
创建(实体);
}
public somet to getSomething(int-id){
SomeEntity=em.findById(id);
//实体->dto转换
返回dto;
}
}
@RequestScoped
@交易的
公共类DaoImpl实现Dao{
@注入
私有实体管理器em;//创建em很便宜
//默认情况下,TxType.REQUIRED是必需的
公共void创建(SomeEntity){
em.persist(实体);
}
@事务性(TxType.不受支持)
公共实体findById(int-id){
返回em.find(SomeEntity.class,id);
}
}
您应该使用EJB3框架,每个工作单元使用一个实体管理器,即无状态实体外观。@Transactional不是EJB注释吗?我想说javax.EJB.TransactionaAttribute
是EJB注释,javax.transaction.Transactional
是CDI。由于JavaEE7,您可以使用@Transactional
拦截器以声明方式为基于CDI的bean控制事务。如果您绑定到JavaEE6,您需要创建自己的拦截器()。谢谢,这正是我所需要的!如果其他任何人想用CDI实现声明性事务,这里有另一篇文章:检查当前登录用户权限的代码应该在哪里?或者任何依赖于当前登录用户的逻辑?