如何为简单的CRUD操作实现泛型dao(Java EE,EJB注入)

时间:2018-05-21 21:58:06

标签: java java-ee ejb dao

我现在正在重构我的代码,我注意到我可以使用泛型抽象类来进行CRUD操作。 但不幸的是我被卡住了。 问题是,当我将DAO类注入Service类时,我需要使用实体的远程接口(在我的例子中为Category),请参阅下面的代码。

通用dao的远程接口

public interface IGenericDaoRemote<T> {
void add(T t);
void remove(T t);
void update(T t);
List<T> getAll(Class<T> type);
}

抽象类泛型dao

@Stateless
@Remote(IGenericDaoRemote.class)
@Local(IGenericDaoLocal.class)
public abstract class GenericDao<T> implements IGenericDaoLocal<T>, IGenericDaoRemote<T> {
    @PersistenceContext(name = "postgresPersistant")
    private EntityManager entityManager;

    @Override
    public void add(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.save(t);
    }

    @Override
    public void remove(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.delete(t);
    }

    @Override
    public void update(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.update(t);
    }

    @Override
    public List<T> getAll(Class<T> type) {
        Session session = entityManager.unwrap(Session.class);
        Criteria criteria = session.createCriteria(type).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return criteria.list();
    }
}

dao类示例:

@Stateless
@Remote(ICategoryDaoRemote.class)
@Local(ICategoryDaoLocal.class)
public class CategoryDao extends GenericDao<Category> implements ICategoryDaoRemote, ICategoryDaoLocal {
}

服务类:

@Stateless
@Local(ICategoryServiceLocal.class)
@Remote(ICategoryServiceRemote.class)
public class CategoryService implements ICategoryServiceRemote, ICategoryServiceLocal {

    @EJB
    private ICategoryDaoRemote categoryDao; // <-- here is a problem
.
.
.
}

正如您所看到的,因为我使用ICategoryDaoRemote接口作为初始化变量的类型,所以我无法访问泛型dao方法。 我错过了一些简单/基本的东西吗? 或者还有其他方法可以做到吗?

请耐心等待我的英语,我尽我所能!

1 个答案:

答案 0 :(得分:0)

你真的需要远程吗?如果您不打算将bean公开给某些单独的应用程序,只需使用本地接口。

不是&#34;唯一的区别&#34;。这是一个巨大的差异。 仅当您要从群集中的另一个节点访问一个节点上的EJB时,才需要远程。或者,如果要从另一个EAR访问一个EAR中的EJB。

我建议遵循:

  1. 删除远程接口:接口和引用的定义。

  2. 在本地界面中定义所需的方法。