ORM 和 DAO 设计模式

Posted

技术标签:

【中文标题】ORM 和 DAO 设计模式【英文标题】:ORM and DAO design patterns 【发布时间】:2013-07-12 03:48:08 【问题描述】:

我想将 Dao 模式与 hibernate orm 一起使用,但我对如何创建数据传输对象感到困惑。

例如,如果我有一个用户表和订单表,则为一对多关系。 使用休眠我的 UserDTO 包含所有用户列 + OrdersDTO。 OrdersDTO 将由休眠的延迟加载填充,所以如果我说 UserDao.getUserByPk(1) 我会获取所有用户数据和他的所有订单,然后将此对象发送到视图。

如果我将 Hibernate 更改为 JDBC,那么我有一个问题,如果我说 UserDao.getUserByPk(1) 我只得到用户数据,对于他的订单我需要执行 OrdesDao.getOrdersByUserId(1),但在我看来我有只有一个对象。

所以我的问题是如何使用 ORM 功能(例如延迟加载),但同时如果我更改数据源,我的业务逻辑不会受到影响。

谢谢

【问题讨论】:

【参考方案1】:

您必须创建一个“dao”抽象层来执行此操作。包含业务逻辑的服务层应该调用 dao 层来获取任何 DTO。 dao 层应该包含契约/接口和实现(基于 Hibernate、JDBC 或其他)。您应该能够通过一些外部化配置来配置您的 dao 实现选择(以防止在 dao 层实现选择发生任何变化后重新编译)。

View Layer > Service Layer > Dao Layer (HibernateImpl or JdbcImpl or etc.) > 从 db 获取数据到 DTO 并返回给调用者。

【讨论】:

所以你是说在我的 userdao 中我得到我的休眠用户对象后我应该将它映射到一个 dto pojo 并将它返回到服务?不能直接返回休眠用户对象吗? 您不应该在层上或下传递 Hibernate 对象,因为您计划交替使用 Hibernate 和普通 JDBC。图片 如果您确实跨层传递了 Hibernate 对象,并且您尝试从 Hibernate 切换到普通 JDBC,那么您对 ​​Hibernate 框架类有非常强的依赖性,这将不允许您从项目中删除 Hibernate JAR。跨度> 好的,我同意你的观点,但我如何将我的休眠对象映射到 pojo,我指的是延迟加载对象(连接表)。如果我不使用延迟加载并只返回简单的 pojo,那么 orm 将失去一个重要的功能 如果您使用的是基于 Hibernate XML 的映射,那么您的 POJO 不会被 Hibernate Annotation API 入侵,因此在这种情况下,您的 POJO 可以被视为 DTO,您可以将它们跨层传递。但是,如果您在 POJO 中使用 Hibernate Annotations 进行映射,我建议您使用 XML 映射,如果没有,那么您必须将 Hibernate Annotated POJO 转换为 DTO,然后将 DTO 返回给调用者代码。在这种特殊情况下,您可以使用 Apache Common BeanUtils 等 API 编写通用转换机制。 你忘记了模型层,,,

以上是关于ORM 和 DAO 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

将 DAO 模式与 ORM 系统一起使用是不是有意义? [关闭]

mybatis关于ORM的使用以及设计[DaoInterface 转换 Mapper代理对象]

DAO设计和数据结构

Android数据库设计——1,面向对象(ORM)建库建表

Android数据库设计——1,面向对象(ORM)建库建表

spring入门一:框架整体简介