【发布时间】:2012-12-04 14:31:22
【问题描述】:
我有 spring/hibernate 网络应用程序。我使用 Hibernate 来实现几乎所有的 DAO。但是,有时我需要使用基于 JDBC 的实现。对于每个 DAO,我都有一个接口,比如 ProductDao',并且我有一个 ProductDaoHibImpl 或 ProductDaoJdbcImpl 的实现。问题是,比如说,如果我有一个带有两种方法的 DAO,其中一种方法可以使用 Hibernate 实现,而另一种方法可以使用 jdbc 实现。什么是最好的类设计。
我想出了这些设计:
- 一个接口两个实现,在每个类中没有实现的方法中抛出运行时异常。 (即当调用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。
【问题讨论】:
-
你能给我们举一个这两个方法签名的例子吗?
-
这听起来像是可以使用 Projections 完成的事情,但这不是这个问题。
-
对不起,如果我失去了重点,但你不能创建两个接口吗?一个用于 jdbc,另一个用于休眠,然后您使用选项 1-like 没有运行时异常
-
设计1是反OO原则?我不同意,这是多数据访问层实现最合理的OO原则。它为在 spring 容器中配置/切换/单元测试数据访问层提供了最佳的可重用性和可扩展性。我认为这里的设计错误是您需要同时使用 Hibernate 和 JDBC 的原因。我无法想象一个 DAOImpl 类使用多种数据库评估技术,尤其是通过多种方法实现。除非您有非常特殊的要求,否则我将始终将其视为软件架构师级别的设计错误。
标签: java spring hibernate design-patterns dao