【发布时间】:2014-12-02 10:33:17
【问题描述】:
如何为如下所示的 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 作用域:
- @SessionScope: 对我来说,这似乎是最合适的范围,因为单个实例专用于活动会话。
- @Dependent: 也是合理的,因为这样的实例将适合注入它的对象的生命周期。
我认为所有其他 CDI 范围都不合适:
-
@ApplicationScoped:由于应用程序范围的存储库一次只会创建一次,因此像:
entityManager.clear()这样的调用将导致所有当前会话的所有实例也将被分离。此外,这个单一的存储库必须处理所有传入的请求。可能此范围适用于只读存储库? - @RequestScope:我认为没有必要为每个传入的请求创建一个新的存储库实例。
-
@ConversionScoped:转换通常在 GUI 层强制执行。如果我希望存储库在转换结束后终止,我可以将其定义为
@Dependent。
那么,对于这个问题,是否有任何已知的最佳实践?
【问题讨论】:
标签: java jakarta-ee jpa scope cdi