把zk-waiter-service 扩展了一下,CoffeeOrderController 提供获取订单列表的接口:
@GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public List<CoffeeOrder> listOrder() {
log.info("List order");
List<CoffeeOrder> order = orderService.list();
return order;
}
CoffeeOrderService 提供了实现:
public List<CoffeeOrder> list() {
return orderRepository.findAll(Sort.by("id"));
}
zk-customer-service 在按id查询一个订单后,再执行一下查询所有订单的接口:
private void queryAllOrder() {
ParameterizedTypeReference<List<CoffeeOrder>> ptr = new ParameterizedTypeReference<List<CoffeeOrder>>() {};
ResponseEntity<List<CoffeeOrder>> list = restTemplate.exchange("http://waiter-service/order/", HttpMethod.GET, null, ptr);
list.getBody().forEach(o -> log.info("itr order: {}", o));
}
问题来了,获取订单列表的时候,每个订单输出的信息并没有包含具体的咖啡信息(可以看到下面items字段都是null):
itr order: CoffeeOrder(id=1, customer=Lily, items=null, state=INIT, createTime=Mon Jun 24 15:12:21 CST 2019, updateTime=Mon Jun 24 15:12:21 CST 2019)
itr order: CoffeeOrder(id=2, customer=Lily, items=null, state=INIT, createTime=Mon Jun 24 15:14:26 CST 2019, updateTime=Mon Jun 24 15:14:26 CST 2019)
itr order: CoffeeOrder(id=3, customer=Li Lei, items=null, state=INIT, createTime=Mon Jun 24 15:16:48 CST 2019, updateTime=Mon Jun 24 15:16:48 CST 2019)
看WaiterServiceApplication输出的日志,可以看到并没有执行关联查询查具体的coffee信息:
Hibernate:
select
coffeeorde0_.id as id1_1_,
coffeeorde0_.create_time as create_t2_1_,
coffeeorde0_.update_time as update_t3_1_,
coffeeorde0_.customer as customer4_1_,
coffeeorde0_.state as state5_1_
from
t_order coffeeorde0_
order by
coffeeorde0_.id asc
这是为什么呢?我自己新建工程重写一遍也是如此,同样的代码逻辑,按照本章之前的教程做下来、不做服务化改造的时候都是正常的。
展开
作者回复: Hibernate有懒加载,你设置eager模式把懒加载关了,就能直接把集合也加载出来了。