Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有JPA和CDI的JSF应用程序后端体系结构_Jsf_Jpa_Architecture_Cdi - Fatal编程技术网

带有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是否应该是请

我正在使用JPA和CDI开发JSF应用程序;我使用以下后端体系结构:

  • 控制器(JSF进程的CDI注释)
  • 服务(要注入控制器和其他服务的CDI注释)
  • DAOs(由EntityManager处理)
我的问题是,EntityManager应该如何处理事务? 例如,事务(我不使用EJB或Deltaspike,因此没有可用的声明性事务)应该由服务层管理(对吗?),但是与其他操作相关的每个数据都应该由DAO处理。那么EntityManager应该注入到哪里呢

此外,EntityManager是否应该是请求(或会话或方法)范围

谢谢, krisy

我将使用服务层来管理业务逻辑,使用数据访问层来管理对象关系模型。因此,实体经理和事务应该是DAO的一部分。让交易尽可能短是很重要的

选择哪种类型的作用域并不明显,因为它取决于bean/应用程序的性质。演示后的示例用法,幻灯片#15:

  • @RequestScoped
    :DTO/Models,JSF支持bean
  • @ConversationScoped
    :多步骤工作流,购物车
  • @SessionScoped
    :用户登录凭据
  • @ApplicationScoped
    :整个应用程序共享的数据,缓存
正如您所看到的,给定bean和相关实体管理器的作用域对于它所关注的问题是特定的。如果给定的bean是请求作用域,那么它的状态将为同一HTTP会话中的单个HTTP请求保留。对于会话范围的bean,状态是通过HTTP会话维护的。示例方法可能类似于以下内容(伪代码):

@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实现声明性事务,这里有另一篇文章:检查当前登录用户权限的代码应该在哪里?或者任何依赖于当前登录用户的逻辑?