当前位置: 代码迷 >> java >> 如何显式加载休眠实体的LAZY获取成员
  详细解决方案

如何显式加载休眠实体的LAZY获取成员

热度:119   发布时间:2023-08-04 09:28:21.0

由于性能方面的考虑,我将休眠状态下的大多数关系映射都设置为fetch = fetchType.LAZY以避免对数据库进行不必要的查询。

....
private ConsumerEntity consumerEntity;

@ManyToOne(fetchType.LAZY)
@JoinColumn(name="orderId", insertable=false, updateable=false)
public ConsumerEntity getConsumerEntity(){
    return this.consumerEntity;
}
....

上面显示了OrderEntityConsumerEntity关系的映射设置。

每次调用者进行查询时,我都会打开一个会话,处理查询并返回结果,然后关闭会话。

Public OrderEntity getOrderEntity(orderQueryParam){
   Sting hql = buildHqlStrFromParam(orderQueryParam);
   return (OrderEntity)this.getEntityByHql(hql); // in the method just 1. open a session; 2. retrieve entity 3. close the session;
}

有时我知道呼叫者可能也需要相关记录。 例如,如果他询问特定的Order记录,我可能也想给他ConsumerEntity,所以他可以做点事情来获取他需要的信息,而不必处理第二个查询或获取一个延迟加载例外,因为会话已关闭:

  ...
  OrderEntity order = TradeService.getOrderEntity(orderQueryParam);
  ConsumerEntity consumer = order.getConsumerEntity();
  ....

但是这种情况很少见,因此我不想将fetchType更改为EAGER

这个怎么做? 我的意思是我想有一个选择是否加载ConsumerEntity其配置为fetchType.LAZY

如果该标志比调用getter方法为true,则传递布尔检查以加载使用者实体,它将把您的惰性数据加载到对象中并且将进一步可用。

Public OrderEntity getOrderEntity(orderQueryParam, boolean loadConsumerEntity){
    Sting hql = buildHqlStrFromParam(orderQueryParam);
    OrderEntity entity = this.getEntityByHql(hql);
    if(loadConsumerEntity){
      // Your session shoud still open here
      entity.getConsumerEntity();
    }
    return entity; 
}