【发布时间】:2016-10-20 02:37:12
【问题描述】:
我是 JPA 和多层架构编码方式的新手。我目前正在开发一个新项目,我们正在制作一个 API,其中 DAO 层用于使用 JPQL 与数据库进行通信。
目前,我已经编写了 JPQL 语句来从数据库中获取数据。除此之外,我还在执行延迟初始化以检索复杂对象。我想知道在 DAO 层执行延迟初始化是否是正确的方法。
我在 DAO 层之前还有 2 层,称为引擎层和 EJB 层,在这些层中我的数据库连接处于活动状态,并且也可以在那里执行延迟初始化。我想知道这样做是否是一种很好的架构方式,因为我希望与东西相关的数据库只在 DAO 层中。
但是,我又一次陷入困境,我争辩说为什么在 EJB/Engine 层中进行延迟初始化不是一个好方法,因为我让数据库连接处于活动状态以执行 DB 操作。我之所以这么想是因为我只能在DAO层检索必要的数据,这些数据可以重复使用,并且可以根据不同类的需要进行惰性初始化。
我不确定为什么我在引擎和 EJB 层中激活了数据库连接(我希望这是用于事务管理)。它发现它是按照架构师的建议完成的,我将 EJB 定义为无状态,并且引擎级别的类在其范围内具有数据库连接。
抱歉,问题冗长。希望我已经提供了必要的细节来回答这个问题。
附:请向我推荐任何好书或文章,以帮助我决定哪个层负责理想地执行什么任务。
【问题讨论】:
-
由于延迟初始化的目的是将实体的加载推迟到需要它们之前,我的意见是在您仍然有
Session或 @987654322 的最高层执行它@ 在范围内(在您的情况下为 EJB)。将它们加载到你的 DAO 中总是会这样做,无论你是否真的需要它们,或者是否违背了懒惰的目的。我的 0.02 美元。 -
感谢@conscells 的回复,当我们有专门的 DAO 层时,可以在 EJB 层中进行数据库检索吗?
-
如果您使用的是 Hibernate,它就像
Hibernate.initialize(parent.getChildRelation())一样简单。所以在我看来,像if (userRequestedChild) { Hibernate.initialize(...); } return parent;这样的事情在 EJB 层中是可以的。
标签: java jpa jpql lazy-initialization multi-layer