更新父级时,Spring Framework不会更新子实体

时间:2018-04-19 21:16:01

标签: spring hibernate spring-boot spring-data

我无法弄清楚出了什么问题。这是我的酒店实体,有餐厅:

@OneToMany(mappedBy = "hotel", cascade = CascadeType.ALL)
@JsonIgnoreProperties({"hotel"})
private List<Restaurant> restaurants;

这是我的餐厅实体,有酒店:

@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(
        name = "restaurant_hotel",
        joinColumns = @JoinColumn(name = "restaurant_id"),
        inverseJoinColumns = @JoinColumn(name = "hotel_id")
)
@JsonIgnoreProperties({"restaurants"})
private Hotel hotel;

当我更新餐厅时,我可以毫无问题地设置酒店,并在看到酒店时看到更改。但是当我更新酒店时,只有酒店得到更新。酒店的餐厅不会更新。

只是为了澄清我在更新酒店时无意改变餐厅实体本身,反之亦然。只是想在更新酒店实体时更改哪些餐厅属于酒店。现在我只能在更新餐厅时更改酒店。

我在使用org.springframework.data.repository.PagingAndSortingRepository保存之前检查了酒店对象,并且它有正确的餐厅。

1 个答案:

答案 0 :(得分:0)

您应该查看此帖子https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/,特别是该部分 在双向@OneToMany中提到父实体上的两个实用程序方法。

  

父实体Post具有两种实用方法(例如addComment和removeComment),用于同步双向关联的两端。在使用双向关联时,您应始终提供这些方法,否则,您将面临非常微妙的状态传播问题。

我相信您的问题与类似的状态传播问题有关,如果您在父酒店实体中添加实用程序方法addRestaurant,removeRestaurant并在更新酒店之前使用它们,它将得到解决。

    public void addRestaurant(Restaurant restaurant) {
        restaurants.add(restaurant);
        restaurant.setHotel(this);
    }

    public void removeRestaurant(Restaurant restaurant) {
        restaurants.remove(restaurant);
        restaurant.setHotel(null);
    }

您的案例与链接中的案例之间的区别在于您使用的是@JoinTable而不是@JoinColumn,但我认为无论如何都不重要。