如何为JPA存储库确定适当的CDI范围,如下所示?
@Transactional
public class CategoryRep extends EntityRepository<Integer, Category> {
private static final long serialVersionUID = 856370976984333182L;
public List<Category> getAllCategories() {
// TODO
}
public List<Post> getAllPostsOfCategory(Integer categoryId) {
// TODO
}
@Transactional(value = TxType.REQUIRES_NEW, rollbackOn = RuntimeException.class)
public void createCategory(final String name, final String description)
throws DaoJpaException {
// TODO
}
}
我只能想到两个CDI范围:
在我看来,所有其他CDI范围都不合适:
entityManager.clear()
这样的调用将导致所有当前会话的所有实例也将被分离。此外,此单个存储库必须处理所有传入请求。可能这个范围适用于只读存储库吗?@Dependent
。那么,这个问题是否有任何已知的最佳实践?
答案 0 :(得分:3)
描述所有选项
所以我会选择
所以如果我是你,我会选择Request scope存储库,这是最容易的选择,你会避免所有这些问题。
答案 1 :(得分:1)
您应该使用@ApplicationScoped。
每个请求都应该使用EntityManager,而不是重复使用。
在请求开始时,您创建了entityManager,当它完成提交或回滚时。
@Dependent将具有与其主机相同的范围,如果您将其注入@RequestScoped并且bean具有相同的范围。
@SessionScoped只能用于小数据(如用户登录和权限)。