Java ORM与DAO设计模式

Java ORM与DAO设计模式,java,hibernate,orm,dao,Java,Hibernate,Orm,Dao,我想在hibernate orm中使用Dao模式,但我对如何创建数据传输对象感到困惑 例如,如果我有一个users表和orders表,则为1对多关系。 使用hibernate时,我的UserDTO包含所有用户列+OrdersDTO。OrdersTo将由hibernate使用延迟加载填充,因此如果我说UserDao.getUserByPk(1),我将获得所有用户数据和他的所有订单,并将此对象发送到视图 如果我将Hibernate更改为JDBC,那么我会遇到一个问题,如果我说UserDao.getU

我想在hibernate orm中使用Dao模式,但我对如何创建数据传输对象感到困惑

例如,如果我有一个users表和orders表,则为1对多关系。 使用hibernate时,我的UserDTO包含所有用户列+OrdersDTO。OrdersTo将由hibernate使用延迟加载填充,因此如果我说UserDao.getUserByPk(1),我将获得所有用户数据和他的所有订单,并将此对象发送到视图

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

因此,我的问题是如何使用ORM功能(例如lazyload),但同时如果我更改数据源,我的业务逻辑将不会受到影响

谢谢

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


查看层>服务层>Dao层(HibernateImpl或JdbcImpl等)>将数据从db中提取到dto并返回给调用者。

那么您是说在我的userdao中,在我获取hibernate用户对象后,我应该将其映射到dto pojo并返回到服务?我不能直接返回hibernate用户对象吗?您不应该在该层上下传递hibernate对象,因为您计划交替使用hibernate和普通JDBC。图像如果您确实跨层传递了Hibernate对象,并且尝试从Hibernate切换到普通JDBC,那么您对Hibernate框架类有很强的依赖性,这将不允许您删除Hibernate JAR在这一点上我同意你的看法,但是我如何才能将我的hibernate对象映射到pojo,并引用惰性加载对象(联接表)。如果我不使用lazy load并只返回简单的pojo,那么orm将失去一个重要的功能如果您使用的是基于Hibernate XML的映射,那么您的pojo不会被Hibernate注释API入侵,因此在这种情况下,您的pojo可以被视为DTO,您可以跨层传递它们。但是,如果您在POJO中使用Hibernate注释进行映射,我建议您转到XML映射,如果没有,则必须将Hibernate注释的POJO转换为DTO,然后将DTO返回给调用方代码。在这种特殊情况下,您可以使用ApacheCommonBeanutils等API编写通用转换机制,,,