【发布时间】:2020-09-17 11:03:10
【问题描述】:
这是一个演示该问题的示例代码:
膳食实体:
@Entity
public class Meal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany(mappedBy = "meal", cascade = CascadeType.PERSIST)
private Collection<Food> foods;
public Meal() {
foods = new HashSet<>();
}
public Collection<Food> getFoods() {
return foods;
}
public void addFood(Food food) {
foods.add(food);
// without this the `meal_id` column is null
food.setMeal(this);
}
}
食品实体:
@Entity
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
private Meal meal;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Meal getMeal() {
return meal;
}
public void setMeal(Meal meal) {
this.meal = meal;
}
}
这里是创建和保存实体的代码:
Meal meal = new Meal();
for (int i = 0; i < 10; i++) {
meal.addFood(new Food());
}
mealRepository.save(meal);
由于CascadeType.PERSIST,Meal 和 Food 实体都保持不变,但如果我没有将 meal 字段显式设置为 Meal 实体,meal_id 列将保持为空。
这不是我所期望的行为,我想知道为什么这不是自动为我完成的。
【问题讨论】:
-
很多事情不是自动为你完成的,所以你只是有错误的期望。为什么它会自动完成,因为
foods.add(food);不是自动完成的?程序员最终对程序的工作负责,因此在双向映射等棘手的情况下阅读文档是必不可少的。 -
我投票结束这个问题,因为它按设计工作。
-
当问题是为什么时,@Kayaman“按设计工作”并不是真正的答案。我知道你不知道答案,也许其他人会。
-
这不是答案,而是关闭的理由。你的问题是“为什么它不像我想的那样工作?”对此没有很好的答案。除非您阅读过文档,否则您会知道它是如何工作的,并且您不会有错误的期望。不要假设事情会像你想的那样工作。像所有优秀的软件开发人员一样阅读文档。
-
@Kayaman 我建议您研究 DX(开发人员体验)。开发人员的优秀软件工具大部分时间都按预期工作。一位开发人员曾经做出了设计决定,我很好奇是什么导致了这个决定,这就是我的问题所在。
标签: java spring database hibernate jpa