如何防止hibernate中只在子表中进行更新操作(单向一对多映射)



我有两张桌子Restaurant和FoodItems。

我的要求:

  1. 如果我添加了Restaurant数据,则需要添加FoodItems数据
  2. 如果我删除了Restaurant数据,那么FoodItems数据就需要删除
  3. 如果我更新了Restaurant数据,那么FoodItems数据就不需要更新

面临的问题:
当我更新餐厅详细信息时,食品数据也会更新。

复制步骤:
我使用poster工具将JSON数据发送到java端
JSON:

{"restaurantId":1."restaurantName":"Salem RRR";,"restaurantAddress":"omr,钦奈"}

我不会在JSON中传递foodItems。当我在java端直接调用session.update(restaurant(时,则食品数据被删除
我知道这是因为餐厅餐桌上的cascade=CascadeType.ALL选项。

我的查询:
但我不知道如何阻止更新操作。我刚开始冬眠。请帮我们解决这个问题。提前感谢

餐厅.java

@Getter
@Setter
@Entity
@Table(name = "restaurant")
public class Restaurant {
@Column(name = "restaurant_id")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int restaurantId;
@Column(name = "restaurant_name",nullable = false)
private String restaurantName;
@Column(name = "restaurant_address",nullable = false)
private String restaurantAddress;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "restaurant_fooditems",
joinColumns = {@JoinColumn(name="restaurant_id",referencedColumnName = "restaurant_id")},
inverseJoinColumns = {@JoinColumn(name="food_id",referencedColumnName = "food_id")})
private Set<FoodItems> foodItems;
}

FoodItems.java

@Getter
@Setter
@Entity
@Table(name = "fooditems")
public class FoodItems {
@Column(name = "food_id")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int foodId;
@Column(name = "food_name",nullable = false)
private String productName;
@Column(name = "price",nullable = false)
private double price;
}

我知道这是因为餐厅餐桌上的cascade=CascadeType.ALL选项。

嗯,不完全是。这是因为Restaurant是其自身和FoodItems之间关联的所有者。这意味着关联状态由Restaurant.foodItems属性控制。

假设您只是在服务方法中调用restaurantRepository.save(restaurant),那么如果Restaurant.foodItems为空,则假设所有以前的foodItem都已从关联中删除。即使没有CascadeType.ALL,问题也会持续存在。

最简单的解决方案是从数据存储加载原始Restaurant,并且只复制您想要更新的字段——比如:

@Transactional
public void update(Restaurant updated) {
restaurantRepository.findById(updated.getId())
.ifPresent(original -> {
original.setRestaurantName(updated.getRestaurantName());
original.setRestaurantAddress(updated.getRestaurantAddress());
});
}

相关内容

  • 没有找到相关文章

最新更新