Hibernate:避免对子对象进行嵌套SQL调用

时间:2017-06-27 15:03:50

标签: java sql hibernate jpa plsql

背景

我的应用程序正在使用JPA Criteria从数据库中获取数据,并确定与太多SQL调用(对于子实体)到DB的持久性问题。

在此举例

ENTITY_A  (parent) with 500 item types record

ENTITY_B (child-1) with 1000 item details record

ENTITY_C (child-2) with 1000 item details record

ENTITY_D (child-3) with 1000 item details record

根据要求,我们需要获取父实体及其子(所有实体)的数据。子实体已在父实体中与fetch=FetchType.LAZY映射。

问题

当我们尝试获取500个项目类型(ENTITY_A)时,将以下列方式调用SQL调用的数量:

  • 1调用Entity_A列表(以获取所有500条记录)
  • 对Entity_B List进行500次SQL调用(以获取链接父ID的记录)
  • 对Entity_C List进行500次SQL调用(以获取链接父ID的记录)
  • 对Entity_D List进行500次SQL调用(以获取链接父ID的记录)

我知道一个替代方法是从Criteria切换到SQL Procedure调用(最终将使用SQL类型的SQL调用返回所有数据)

是否有另一种方法可以用这种方式限制对DB的SQL调用?

1 个答案:

答案 0 :(得分:0)

在Hibernate中存在一些Lazy Loading的概念

例如:

@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
@ManyToOne(fetch = FetchType.LAZY)
private User userId;


@OneToMany(fetch=FetchType.LAZY)
private List<User> lstUser;

无论何时调用父母。如果获取类型设置为LAZY。只有在您尝试访问该实体时才会触发查询,否则它将不会