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

How to explicitly load a LAZY fetching member of a hibernate Entity

出于性能方面的考虑,我已将休眠中的大部分关系映射设为 fetch = fetchType.LAZY 以避免对数据库进行不必要的查询。

....
private ConsumerEntity consumerEntity;

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

以上为OrderEntityConsumerEntity关系的映射设置。

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

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;
}

有时我知道来电者可能也需要相关记录。比如,如果他询问特定的订单记录,我可能也想给他 consumerEntity,这样他就可以做一个 dot 的事情来获取他需要的信息,并且不会'不必处理第二个查询或获得延迟加载异常,因为会话已关闭:

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

但这种情况很少见,所以我不想将fetchType更改为EAGER

如何做到这一点?我的意思是我想选择是否加载配置为 fetchType.LAZY.

ConsumerEntity

如果该标志为真,则传递布尔检查以加载消费者实体而不是调用 getter 方法,它会将您的惰性数据加载到对象中并进一步可用。

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; 
}