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

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

在DAO层之前,我还有2层分别称为Engine层和EJB层,在这些层中,数据库连接处于活动状态,并且可以在其中执行延迟初始化。我想知道这样做是否是一种好的架构方法,因为我希望与内容相关的数据库仅在DAO层中运行。

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

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

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

附言请给我建议任何好的书或文章,这些书或文章将帮助我确定哪一层负责执行理想的任务。

最佳答案

我会说在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。

关于java - JPA-DAO层中的延迟初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40144497/

10-09 04:12