【问题标题】:JPA - Lazy Initialization in DAO layerJPA - DAO 层中的延迟初始化
【发布时间】: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


【解决方案1】:

我会说在 DAO 中这样做是正确的做法。但是创建一个单独的方法供常用。例如,如果您有获取部门的方法,例如

public List<Department> getDepartments() {
     //get departments
     //Also fetch employees in each department here  // DON'T DO   
} 

如果有另一种特定的方法来获取所有实体并正确地 java doc 它会很好。

public List<Department> getDepartmentsWithEmployees() {
     //get departments
     //Also fetch employees in each department here     
}

因此人们会根据需要调用正确的方法,并会减少出现任何性能问题的机会。

注意:如果可能,请使用 Join Fetch。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多