2015-07-28 56 views
1

由于性能问题,我已将大部分休眠关系映射作为fetch = fetchType.LAZY以避免不必要的对数据库的查询。 如何显式加载休眠实体的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; 
} 

有时我知道来电者可能需要的相关记录也是如此。就像,如果他询问特定的订单记录,我可能也想给他消费者实体,所以他可以做一个事情来获取他需要的信息,而不必处理第二个查询或得到一个延迟加载的异常,因为会话已经关闭:

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

但情况是非常罕见的,这样我不想改变fetchTypeEAGER

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

+1

您可以推断这是一个共同的要求,因此必须存在多个重复问题。那么你发现了哪些类似的问题,为什么他们不回答你的问题?因为我在“相关”问题中已经看到了一些赢家。 – Gimby

回答

1

通过一个布尔检查来加载消费者实体,如果该标志是真实的比调用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; 
} 
+0

不要在getEntityByHql中使用会话,其他明智的getter方法会抛出错误。会话在getOrderEntity方法中打开并关闭活动。 –