我有 spring/hibernate web 应用程序。我使用 Hibernate 来实现几乎所有的 DAO。然而,有时我需要使用基于 JDBC 的实现。对于每个 DAO,我都有一个接口(interface),例如 ProductDao',并且我有一个 ProductDaoHibImpl 或 ProductDaoJdbcImpl 的实现。问题是,如果我有一个具有两种方法的 DAO,其中一种方法适合使用 Hibernate 实现,另一种方法适合使用 jdbc 实现。最好的类设计是什么。
我想出了这些设计:
- 一个接口(interface)有两个实现,每个类中未实现的方法都会引发运行时异常。 (即当调用 hibernate 类中实现的方法时,jdbc 实现将抛出运行时异常)
- 将两个实现合并到一个类中
- 实现两个类中的所有方法
但是,
- 设计 1 是反 OO 原则。
- 设计 2 将会搞乱 我的 DAO 实现的一致性,并且将使该类 本身可读性较差,并且会邀请其他开发人员继续添加 没有组织的方法。
- 设计 3 添加了不必要的内容 工作,因为无论如何我都会使用更有效的实现。
对于多个 DAO 不完整实现,什么是更好的设计?
示例:
public interface RxDao {
public Rx getRxById(int rxId);
public Map<String, List<Notification>> getAllRxNotificationsGroupedByFacility();
}
getRxById
使用 hibernate 实现是有意义的,因为您可以使用 hibernate ORM。
getAllRxNotificationsGroupedByFacility
仅检索 Rx 列的子集,但获取更多数据,这些数据需要以某种方式分组,并最终发送到另一台服务器,因此它使得更有意义的是使用 jdbc 来实现它。
最佳答案
方法 2 对我来说看起来相当不错,但是,我不太明白为什么您将其视为两个实现合并在一起。
创建一个 DAO 是很常见的,它对大多数方法使用高级 Hibernate 功能,但对于需要它的方法则回退到较低级别。请注意,您可以使用 Hibernate API( native 查询、doWork(...)
等)进行低级访问,因此将 Hibernate 与 JDBC 混合使用不会带来额外的复杂性。
类似这样的事情:
public class HibernateRxDao implements RxDao {
...
public Rx getRxById(int rxId) {
return sf.getCurrentSession().get(rxId, Rx.class);
}
public Map<String, List<Notification>> getAllRxNotificationsGroupedByFacility() {
return toMap(sf.getCurrentSession().createNativeQuery(...). ... .list());
}
private Map<String, List<Notification>> toMap(List<Object[]> rows) { ... }
}
关于java - 多个 DAO 不完整实现设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13705205/