将 jpa 实体作为 spring 组件是一个好主意吗

the*_*ker 5 java spring hibernate jpa

我遇到了这个问题,是否应该使用 new 关键字创建 jpa 实体,或者将您的实体作为具有原型范围的 spring 组件并从应用程序上下文中获取 bean。

我个人认为我们不应该将您的实体作为 Spring 组件并自己创建它们,而不是从 Spring 请求它。

Pet*_*der 1

这意味着实体可以被注入到任何地方,但我们有德米特法则,对象应该只与它们的近邻进行通信。当然,我们可以说,我们根本不在服务中使用它们,而是仅在 DAO 服务中使用它们,但目前我们还没有大赢家。

我的意思是,我喜欢将所有对象结构集中在一处的想象力。如果有人问,它是在哪里创建的,我们可以说:“Spring 创建了它”。

另一个原因是表可能有非空列。如果 JPA 实体是 100% 数据库兼容的实体 bean,则它至少需要一个自动原型创建不支持的构造函数参数。我们可以删除该构造函数参数,并将任何对该非空列的违规从编译时移至运行时,但如果我们删除该构造函数参数,我们也会删除快速失败原则。

依赖倒置原则也是有原因的。我的理由(恭敬地)与 Makoto 的理由略有不同。DIP 背后的想法之一是

高层模块不应该依赖于低层模块。

您是否同意这样的想法:以这种方式创建的实体是低级模块,而需要它的服务是高级模块?所以我们放弃了DIP的这一部分。