将jpa实体作为弹簧组件是一个好主意

时间:2018-02-28 18:07:38

标签: java spring hibernate jpa

我遇到了这个问题,是否应该使用new keyword或者创建jpa实体 使用原型范围将您的实体作为spring组件,并从Application Context获取bean。

我个人认为我们不应该将你的实体作为弹簧组件并自己创建它们而不是从Spring那里提出它。

3 个答案:

答案 0 :(得分:2)

Spring给你的主要好处是依赖注入和控制反转。当您处理JPA实体时,绝对希望控制其生命周期,而不仅仅是处理级联操作(保存和删除),还为了清晰和理智。

更糟糕的是,这种开发风格绝对与Spring结合在一起;你可以使用JPA / Hibernate 而不用 Spring,你是否应该发现自己处于想要迁移它的位置,如果你的JPA实体通过你的框架连接,你会发现离婚非常,非常困难。

你不想让Spring管理这些实体。它增加了代码库本身的复杂性,但收效甚微。

答案 1 :(得分:1)

你可以这样做,但它会有意义吗?

否,原因有多种。
最明显的一个来自使对象成为bean的第一个原因:

我们是否应该将实体视为我们想要注入的依赖?
答案当然是 因此实体不必是豆类。

实体的生命周期由持久化上下文而不是Spring容器处理,你确实不想注入一个实体,但你通常希望在方法中创建它:你自己或通过EntityManager。登记/> 所以Spring在这里完全无关紧要。

答案 2 :(得分:1)

这意味着可以在任何地方注入实体,但我们有这个Demeter法则,物体只能与它们的近邻通信。当然,我们可以说,我们只是不在服务中使用它们,而只在DAO服务中使用它们,但我们目前没有大赢家。

我的意思是我喜欢在一个地方集中所有对象构造的想象力。如果有人问,在哪里创建,我们可以说:" Spring创建它"。

另一个原因是表可能具有非空列。如果JPA实体是100%与数据库兼容的实体bean,则它至少需要一个不受自动原型创建支持的Constructor-Argument。我们可以删除那个构造函数参数并将任何非null-column列从编译时再次移动到运行时,但是如果我们删除那个构造函数参数,我们也会删除fail-fast原则。

依赖 - 倒置原则也有一个原因。我在这里的理由(尊敬地)与Makoto的原因有点不同。 DIP背后的一个想法是

  

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

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