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

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

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

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

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

谢谢

【问题讨论】:

    标签: java hibernate orm dao


    【解决方案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 编写通用转换机制。
    • 你忘记了模型层,,,
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2012-04-14
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2012-10-29
    相关资源
    最近更新 更多