问题描述
由于性能方面的考虑,我将休眠状态下的大多数关系映射都设置为fetch = fetchType.LAZY
以避免对数据库进行不必要的查询。
....
private ConsumerEntity consumerEntity;
@ManyToOne(fetchType.LAZY)
@JoinColumn(name="orderId", insertable=false, updateable=false)
public ConsumerEntity getConsumerEntity(){
return this.consumerEntity;
}
....
上面显示了OrderEntity
和ConsumerEntity
关系的映射设置。
每次调用者进行查询时,我都会打开一个会话,处理查询并返回结果,然后关闭会话。
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
。
1楼
如果该标志比调用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;
}