问题描述
我有两个表Restaurant和FoodItems。
我的要求:
面临的问题:
当我更新餐厅的详细信息时,美食项目数据也会随之更新。
复制步骤:
我使用邮差工具将JSON数据发送到Java端。
JSON:
{ “ restaurantId”:1 “ restaurantName”:“ Salem $$”, “ restaurantAddress”:“ omr,chennai” }
我没有在JSON中传递foodItems。当我直接在Java端调用session.update(restaurant)时,
然后删除fooditems数据。
我知道这是因为餐厅表中的cascade = CascadeType.ALL选项。
我的查询:
但是我不知道如何防止更新操作。
我是新来的冬眠。请帮助我们摆脱这个问题。
预先感谢
Restaurant.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选项。
嗯,不完全是。这是因为cout << *pc << endl;
^ dereferences pc to print only the single character it points to
是其自身与Restaurant
之间的关联的所有者。这意味着关联状态由FoodItem
属性控制。
假设您只是在服务方法中调用Restaurant.foodItems
,则如果restaurantRepository.save(restaurant)
为空,则假定所有先前的Restaurant.foodItems
都已从关联中删除。即使没有foodItem
,问题也将继续存在。
最简单的解决方案是从数据存储区加载原始CascadeType.ALL
,并仅复制要更新的字段-诸如此类:
Restaurant