可以将hibernate业务对象用作干净架构中的实体吗?

时间:2017-02-11 11:47:22

标签: java hibernate onion-architecture hexagonal-architecture clean-architecture

在我们的项目中,我们使用eclipse hibernate插件生成的类来实现持久性。 生成的类具有以下结构。

MyClass extends BaseMyClass //POJO's, that are refenced in the hbm
files
MyClassDAO extends BaseMyClassDAO //DAO objects that use hibernate
session objects to provide CRUD API's for working with DB

我的问题是,如果我们使用映射文件中使用的POJO类作为最内层的实体,它是否违反了Uncle Bobs清洁架构。

在这种情况下,hibernate特定的DAO类属于最外层,而UseCases层通过提供要实现的接口与该层进行通信。

提前致谢。

1 个答案:

答案 0 :(得分:0)

鲍勃叔叔在挪威的一次演讲中展示这张幻灯片时对此发表了评论:

Entity Gateway

鲍勃叔叔说:

<块引用>

线以上没有Hibernate。如果您使用的是 Hibernate,它会低于该行。 应用程序不知道您正在使用该框架。它低于线。 Hibernate 是一个可爱的工具。它非常适合从数据库中收集数据并将其转换为数据结构。很不错!但是您不希望您的应用程序知道您正在使用它。你把所有的东西都放在线下。

Robert C Martin - Clean Architecture, NDC 2012 (53:53 - 54:18)

因此,如果您在实体上使用 Hibernate 注释,您会将域对象与数据库层的详细信息混合在一起。

一些开发人员认为注解并不是那么强的依赖关系,因为如果它们在运行时不可用,它们就是不存在。没错,但您还必须考虑其他原则。

如果您将 Hibernate 注释放在实体上,实体类现在有两个不同的更改原因:域逻辑和数据库映射。 这违反了 single responsibility principle。我希望您不希望数据库映射影响您的域对象。

我想有很多混乱,因为重载的术语实体。当鲍勃叔叔谈论实体时,他指的是领域。在 Hibernate 中实体是指数据库记录。

这就是为什么我通常使用术语“域实体”或“数据库实体”来区分它们。