1

我是 JPA 和多层架构编码方式的新手。我目前正在开发一个新项目,我们正在制作一个 API,其中 DAO 层用于使用 JPQL 与数据库进行通信。

目前,我已经编写了 JPQL 语句来从数据库中获取数据。除此之外,我还执行延迟初始化以检索复杂对象。我想知道在 DAO 层执行延迟初始化是否是正确的方法。

我在 DAO 层之前还有 2 个层,称为引擎层和 EJB 层,在这些层中我的数据库连接处于活动状态,并且也可以在那里执行延迟初始化。我想知道这样做是否是一种很好的架构方式,因为我希望与东西相关的数据库只在 DAO 层中。

但是,我再次陷入困境,我争辩说为什么在 EJB/Engine 层中进行延迟初始化不是一个好方法,因为我让数据库连接处于活动状态以执行 DB 操作。我之所以这样想,是因为我只能在 DAO 层检索必要的数据,这些数据可以重用,并且可以根据不同类的需要执行惰性初始化。

我不确定为什么我在引擎和 EJB 层中激活了数据库连接(我希望这是用于事务管理)。它发现它是按照架构师的建议完成的,我将 EJB 定义为无状态,并且引擎级别的类在其范围内具有数据库连接。

对不起,冗长的问题。希望我已经提供了必要的细节来回答这个问题。

PS请向我推荐任何好书或文章,它们将帮助我决定哪一层负责理想地执行什么任务。

4

1 回答 1

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。

于 2016-10-20T02:51:38.180 回答