【发布时间】:2014-01-02 06:45:59
【问题描述】:
我正在尝试仅使用 JPA、CDI(OpenWebBeans + Deltaspike JPA 模块)、JSF 构建应用程序。我以与使用 Spring 框架相同的方式使用部署在 Tomcat 上的 CDI。我有这样的 DAO 称为 GenericDAOImpl(前几行):
public abstract class GenericDaoJpa<T> implements GenericDao<T> {
private static final Log logger = LogFactory.getLog(GenericDaoJpa.class);
@Inject
protected EntityManager entityManager;
private Class<T> type;
EntityManager 是使用 DeltaSpike JPA 模块 http://deltaspike.apache.org/jpa.html 注入的。然后,这个 GenericDao 由服务类使用的具体 DAO(UserDao 等)继承。
例如 UserServiceImpl:
public class UserServiceImpl implements UserService {
private static final Log logger = LogFactory.getLog(UserServiceImpl.class);
@Inject
private UserDao userDao;
@Transactional
public void saveUser(UserDto user) throws UserServiceException {
try {
User u = new User(user);
userDao.create(u);
} catch (Exception e) {
logger.error("Error while creating user.", e);
throw new UserServiceException("Error while creating user.");
}
}
}
以这种方式使用 CDI,DAO 和 Service 类都将具有 Dependent 范围,这与 spring 中它们是单例的不同。因此每个客户端都会注入新的实例。 我应该将 DAO 和服务类的范围更改为 ApplicationScope 吗?但是按照规范,我必须使所有注入的类可序列化。如果是 Dao 类,这可能是个问题,EntityManager 应该被标记为瞬态吗?一个
如果有任何建议,我会很高兴。
【问题讨论】:
标签: jakarta-ee jpa cdi