JPA - DAO层中的延迟初始化

时间:2016-10-20 02:37:12

标签: java jpa jpql lazy-initialization multi-layer

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

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

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

但是,我再次陷入困境,我争辩说为什么不能在EJB / Engine层中进行延迟初始化,这是一种很好的方式,因为我有数据库连接处于活动状态以执行数据库操作。我正在考虑这种方式,因为我只能在DAO层中检索可以重用的必要数据,并且可以根据不同类的需要执行延迟初始化。

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

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

P.S。请向我推荐任何好的书或文章,这些书或文章将帮助我决定哪一层有责任理想地执行哪项任务。

1 个答案:

答案 0 :(得分: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。

相关问题