5

在我们的项目中,我们使用 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 的清洁架构。

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

4

1 回答 1

0

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

实体网关

鲍勃叔叔说:

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

Robert C Martin - 清洁架构,NDC 2012 (53:53 - 54:18)

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

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

如果您在实体上放置 Hibernate 注释,实体类现在有两个不同的更改原因:域逻辑和数据库映射。这违反了单一责任原则。因此,数据库映射将影响您的域对象。

我想有很多混乱,因为术语 entity 重载。当 Bob 大叔谈到实体时,他指的是领域。在 Hibernate 中,实体表示数据库记录。

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

于 2021-07-31T08:56:07.120 回答