【问题标题】:How to implements generic dao for simple CRUD operation (Java EE, EJB injections)如何为简单的 CRUD 操作(Java EE、EJB 注入)实现通用 dao
【发布时间】:2018-05-21 21:58:06
【问题描述】:

我目前正在重构我的代码,我注意到我可以使用通用抽象类进行 CRUD 操作。 但不幸的是,我被卡住了。 问题是,当我将我的 DAO 类注入到服务类中时,我需要使用实体的远程接口(在我的情况下为类别),请参见下面的代码。

通用 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 方法。 我错过了一些简单/基本的东西吗? 或者有没有其他方法可以做到这一点?

请耐心等待我的英语,我已经尽力了!

【问题讨论】:

  • ICategoryDaoRemote 必须扩展 IGenericDaoRemote&lt;Category&gt;

标签: java jakarta-ee ejb dao


【解决方案1】:

你真的需要遥控器吗?如果您不打算将 bean 暴露给一些单独的应用程序,只需使用 local 接口。

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

我建议如下:

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

  2. 在本地接口中定义您需要的方法。

【讨论】:

  • 不幸的是,但即使我可以,结果会不会一样?唯一的区别是私有 ICategoryDaoLocal categoryDao 的变化;
  • 你是对的,但是“差异”是指当前代码的差异,即使我可以使用本地接口也无助于解决我的问题,至少我认为不会。是的,我需要 Remote,我有多个 EJB 项目,一个在 jBoss 应用服务器上运行的 EAR 项目,并且正在与另一个应用服务器通信,简单的分布式系统
  • 如果你真的需要远程接口,好吧,然后删除本地接口。你需要本地接口做什么?
猜你喜欢
  • 2018-11-08
  • 2014-01-19
  • 1970-01-01
  • 2014-08-15
  • 2016-08-03
  • 2012-06-03
  • 2020-09-18
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多