如何显式加载休眠实体的 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;
}
....
以上为OrderEntity
和ConsumerEntity
关系的映射设置。
每次调用者进行查询时,我都会打开一个会话,处理查询并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;
}
出于性能方面的考虑,我已将休眠中的大部分关系映射设为 fetch = fetchType.LAZY
以避免对数据库进行不必要的查询。
....
private ConsumerEntity consumerEntity;
@ManyToOne(fetchType.LAZY)
@JoinColumn(name="orderId", insertable=false, updateable=false)
public ConsumerEntity getConsumerEntity(){
return this.consumerEntity;
}
....
以上为OrderEntity
和ConsumerEntity
关系的映射设置。
每次调用者进行查询时,我都会打开一个会话,处理查询并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;
}