java - 如何为简单的 CRUD 操作(Java EE、EJB 注入)实现通用 dao
问题描述
我目前正在重构我的代码,我注意到我可以使用通用抽象类进行 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 方法。我错过了一些简单/基本的东西吗?或者有没有其他方法可以做到这一点?
请耐心等待我的英语,我已经尽力了!
解决方案
你真的需要遥控器吗?如果您不打算将 bean 暴露给一些单独的应用程序,只需使用本地接口。
不是“唯一的区别”。这是一个巨大的差异。仅当您想从集群中的另一个节点访问一个节点上的 EJB 时才需要远程。或者,如果您想从另一个 EAR 访问一个 EAR 中的 EJB。
我建议如下:
删除远程接口:接口和引用的定义。
在本地接口中定义您需要的方法。
推荐阅读
- android - 通过android中webView的功能进行屏幕录制
- ios - 在 Cordova InAppBrowser-Plugin 中调用“https://localhost”不起作用
- validation - 当空手道 jsonpath 的数组为空时,验证失败
- vb.net - 下拉列表未绑定到正确的源值
- c - 如何使用 GCC/Clang 编译器知道/限制 C 程序中的静态堆栈大小?
- amazon-web-services - 具有 ECS 的 AWS Api 网关缩减至零
- reactjs - KeyboardDatePicker @material-ui/pickers 如何显示月外的日子
- instantsearch.js - 无法执行构面计数,因为没有设置构面 Meilisearch
- r - How can i remove this data?
- autodesk-forge - 从 IFC 到 SVF 的翻译太慢了