java - 如何防止仅在休眠中的子表中进行更新操作(一对多映射单向)?
问题描述
我有两张桌子 Restaurant 和 FoodItems。
我的要求:
- 如果我添加了餐厅数据,则需要添加 FoodItems 数据。
- 如果我删除了餐厅数据,则需要删除 FoodItems 数据。
- 如果我更新了餐厅数据,则不需要更新 FoodItems 数据。
面临
的问题:当我更新餐厅详细信息时,fooditems 数据也会更新。
重现步骤:
我使用邮递员工具将 JSON 数据发送到 java 端。
JSON:
{“restaurantId”:1,“restaurantName”:“Salem RRR”,“restaurantAddress”:“omr,chennai”}
我没有在 JSON 中传递 foodItems。当我在 java 端直接调用 session.update(restaurant) 时,会删除 fooditems 数据。
我知道这是因为餐厅餐桌上的 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
则假定所有以前的 s 都从关联中删除。即使没有CascadeType.ALL
.
最简单的解决方案是从数据存储中加载原始Restaurant
文件,并且只复制您想要更新的字段——比如:
@Transactional
public void update(Restaurant updated) {
restaurantRepository.findById(updated.getId())
.ifPresent(original -> {
original.setRestaurantName(updated.getRestaurantName());
original.setRestaurantAddress(updated.getRestaurantAddress());
});
}
推荐阅读
- d3.js - 为什么这个 SVG 路径在 Firefox 上显示不正确的宽度和高度?
- java - 如何对 Oracle 架构内的所有表执行“选择”查询
- deep-learning - 为 OCR 应用程序实施 AutoML Vision
- mysql - Docker OpenProject DB 到 MySQL
- bash - 从具有不同分隔符的文件中提取几个以空格分隔的字段到 Bash 中的另一个文件中
- javascript - 如何在 Node.js 中的 HTML 页面上显示 API 响应?
- bluetooth-lowenergy - gatt connection primary discoery: request not supported error
- javascript - 猫鼬中的自定义排序功能
- visual-studio - 如何在 VS 中设置构建后事件以复制所有附属程序集
- python - 如何在窗口关闭之前保持python脚本的执行?