我有两张桌子Restaurant和FoodItems。
我的要求:
- 如果我添加了Restaurant数据,则需要添加FoodItems数据
- 如果我删除了Restaurant数据,那么FoodItems数据就需要删除
- 如果我更新了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
是其自身和FoodItem
s之间关联的所有者。这意味着关联状态由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());
});
}