java - 多个 DAO 不完整实现设计

标签 java spring hibernate design-patterns dao

我有 spring/hibernate web 应用程序。我使用 Hibernate 来实现几乎所有的 DAO。然而,有时我需要使用基于 JDBC 的实现。对于每个 DAO,我都有一个接口(interface),例如 ProductDao',并且我有一个 ProductDaoHibImpl 或 ProductDaoJdbcImpl 的实现。问题是,如果我有一个具有两种方法的 DAO,其中一种方法适合使用 Hibernate 实现,另一种方法适合使用 jdbc 实现。最好的类设计是什么。

我想出了这些设计:

  1. 一个接口(interface)有两个实现,每个类中未实现的方法都会引发运行时异常。 (即当调用 hibernate 类中实现的方法时,jdbc 实现将抛出运行时异常)
  2. 将两个实现合并到一个类中
  3. 实现两个类中的所有方法

但是,

  • 设计 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/

相关文章:

java - 从非主线程读取/proc/self/exe 时,Android 权限被拒绝

java - 为什么@Cacheable内部的条件没有任何影响?

java - JAX-WS 连接不会关闭,并在 x 条消息后停止消息传递

Spring 分层上下文

java - hibernate 启动错误

java - 在Java中的curl命令字符串中传递Json值中的空格

java - 在第四个++或--之后中断循环

java - 在类路径中找不到任何 META-INF/persistence.xml 文件

java - 如何使用spring数据计算mongo文档嵌套数组中的项目?

java - 登录页面未链接到 Spring Security