在我的网络应用程序中,在服务布局中,我使用“餐厅”实体的代理(“餐厅”字段上的 FetchType.Lazy)。
User user = userRepository.get(userId);
/*
Getting proxy here, not restaurant object
*/
Restaurant userRestaurantRef = user.getRestaurant();
if (userRestaurantRef != null){
restaurantRepository.decreaseRating(userRestaurantRef.getId());
}
restaurantRepository.increaseRating(restaurantId);
/*
"getReference" invokes "getOne()"
*/
user.setRestaurant(restaurantRepository.getReference(restaurantId));
userRepository.save(user);
Run Code Online (Sandbox Code Playgroud)
在测试中通过控制器调用此方法后,所有其他 RestaurantRepository 的获取方法(例如 findById())也返回代理。
但是,如果我在服务的方法之前调用“findById()”方法,则一切正常。
例如:
mockMvc.perform(put(REST_URL + RESTAURANT1_ID)
.param("time", "10:30")
.with(userHttpBasic(USER)))
.andExpect(status().isNoContent());
Restaurant restaurant = restaurantRepository.get(RESTAURANT1_ID);
Run Code Online (Sandbox Code Playgroud)
“餐厅”是代理
Restaurant restaurantBefore = restaurantRepository.get(RESTAURANT1_ID);
mockMvc.perform(put(REST_URL + RESTAURANT1_ID)
.param("time", "10:30")
.with(userHttpBasic(USER)))
.andExpect(status().isNoContent());
Restaurant restaurantAfter = restaurantRepository.get(RESTAURANT1_ID);
Run Code Online (Sandbox Code Playgroud)
“restaurantAfter”是真正的对象
“get()”进入存储库:
@Override
public Restaurant get(int id) {
return repository.findById(id).orElse(null);
}
Run Code Online (Sandbox Code Playgroud)