使用休眠时的 DAO 模式

Posted

技术标签:

【中文标题】使用休眠时的 DAO 模式【英文标题】:DAO pattern when using hibernate 【发布时间】:2011-11-11 08:20:51 【问题描述】:

我们在应用程序中使用hibernate,喜欢使用DAO模式来实现应用程序的数据层。我已经看到了一些关于使用 ValueObjects/DTO 从 DAO 返回数据的建议

public interface EmployeeDAO 
  List<EmployeeDTO> getEmployees();

返回ValueObjects/DTOs而不是返回休眠域对象有什么好处

public interface EmployeeDAO 
  List<Employee> getEmployees();

将数据从休眠对象复制到值对象并在内存中拥有两个相同数据的副本不是大材小用吗? ValueObjects 真正增加了什么优势?

在 DAO 中是否应该使用 ValueObjects 在业务层和视图层之间只是首选

感谢您的任何建议

湿婆

【问题讨论】:

【参考方案1】:

通常应避免使用 DTO。不过,它们在某些情况下可能很有用:

不返回整个对象图,而是返回仅包含感兴趣信息的临时 DTO。这使代码更具自我记录性。否则,尤其是当返回的实体被分离时,很难知道哪些关联已加载,哪些未加载。 当您必须返回不返回实体实例(聚合等)的查询结果时 由于技术原因(无法访问 Hibernate 库等),无法在客户端使用 Hibernate 实体。虽然在这种情况下,将实体转换为 DTO 的可能是外观层的角色,而不是 DAO 的角色。

【讨论】:

【参考方案2】:

使用 DTO 的主要优点是应用程序的另一层无法修改实际的模型对象,从而更改您的数据。您这样做是为了保护数据的完整性和安全性。考虑到这一点,如果您对可以修改谁/如何修改数据有严格的要求,那么这样做是值得的。

如果你没有这样的要求,你当然可以返回模型实例。请注意不要在您不想更改时更改这些模型。

【讨论】:

以上是关于使用休眠时的 DAO 模式的主要内容,如果未能解决你的问题,请参考以下文章

设备休眠时的 Alamofire 请求

休眠/春季:getHibernateTemplate().save(...) 冻结/挂起

ORM 和 DAO 设计模式

带有休眠的 DAO 和服务层

NullPointerException 使用 Spring 使 Generic Dao 休眠

电脑的休眠和睡眠有啥区别