小编Iva*_*van的帖子

为什么在同一实体上调用 getOne() 后“findById()”返回代理?

在我的网络应用程序中,在服务布局中,我使用“餐厅”实体的代理(“餐厅”字段上的 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)

java hibernate spring-data-jpa

5
推荐指数
1
解决办法
2068
查看次数

标签 统计

hibernate ×1

java ×1

spring-data-jpa ×1