【发布时间】:2016-04-07 08:20:48
【问题描述】:
我想用 EclipseLink 和 OpenEJB 实现描述 here 的 DAO 模式。链接中列出的图 9.1 的第一次尝试工作正常。代码如下:
// CustomerDAO
@Local
public interface CustomerDAO {
Customer findCustomer(String id);
}
// OracleCustomerDAO
@Stateless
@Local(CustomerDAO.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OracleCustomerDAO implements CustomerDAO {
@PersistenceContext(unitName = "MY_EJB")
private EntityManager em;
public Customer findCustomer(String id) {
return em.find(Customer.class, id);
}
}
在我的服务中:
public class CustomerService implements CustomerServiceLocal {
@EJB
CustomerDAO customerDAO;
public Customer findCustomer(String id) {
return customerDAO.findCustomer(id);
}
}
但是,当我想适应工厂模式时,我不知道什么是正确的方法。我在链接中编写了代码作为教程,并添加了两个这样的类:
// DAOFactory
public abstract class DAOFactory {
public abstract CustomerDAO getCustomerDAO();
public enum Factory {
ORACLE;
}
public static DAOFactory getDaoFactory(Factory whichFactory) {
switch (whichFactory) {
case ORACLE:
return new OracleDAOFactory();
break;
default:
break;
}
}
}
// OracleDAOFactory
public class OracleDAOFactory extends DAOFactory {
@Override
public CustomerDAO getCustomerDAO() {
return new OracleCustomerDAO();
}
}
我将我的服务修改为:
public class CustomerService implements CustomerServiceLocal {
public Customer findCustomer(String id) {
CustomerDAO customerDAO = DAOFactory.getDaoFactory(Factory.ORACLE).getCustomerDAO();
return customerDAO.findCustomer(id);
}
}
这给了我一个 NullPointerException。当我使用调试器跟踪代码时,我发现OracleCustomerDAO 中的EntityManager 是null。我认为这是因为我没有在我的新服务中进行任何@EJB 注入,但我不知道该将@EJB 注入放在哪里。
那么用 DAO 工厂模式注入 EntityManager 的正确方法是什么?
【问题讨论】:
标签: java jpa eclipselink dao openejb