Hibernate级联插入失效:仅主表插入数据,关联表无数据排查
Hibernate级联插入失败:Answer表无数据的问题修复
问题根源
你虽然给每个Answer对象设置了关联的Question,但没有将这些Answer添加到Question的answers集合中。Hibernate的CascadeType.ALL是基于主实体(Question)的关联集合来触发级联操作的,当前你的answers集合是空的,所以保存Question时不会触发Answer的级联插入。
修复方案
1. 修正主类中的集合赋值
将创建好的Answer对象添加到Question的answers列表里,替换原来的空集合操作:
Answer a1 = new Answer(5001, "answer 1..."); Answer a2 = new Answer(5002, "answer 2..."); Answer a3 = new Answer(5003, "answer 3..."); // 把Answer对象加入集合 List<Answer> list = new ArrayList<>(); list.add(a1); list.add(a2); list.add(a3); Question q1 = new Question(); q1.setId(1); q1.setQuestion("question...?"); q1.setAnswers(list); // 维护双向关联的另一端 a1.setQuestion(q1); a2.setQuestion(q1); a3.setQuestion(q1); s.save(q1);
2. (可选)规范实体类的关联维护
为了避免重复代码,建议在Question类中添加维护关联的方法,确保双向关联的一致性:
@Entity @Table(name="ques") public class Question { // 原有属性... @Id private int id; private String question; @OneToMany(mappedBy = "question", cascade = javax.persistence.CascadeType.ALL) private List<Answer> answers = new ArrayList<>(); // 初始化集合 // 添加此方法 public void addAnswer(Answer answer) { this.answers.add(answer); answer.setQuestion(this); // 自动设置Answer的关联 } // 原有getter/setter方法... }
之后主类中可以简化为:
Question q1 = new Question(); q1.setId(1); q1.setQuestion("question...?"); q1.addAnswer(a1); q1.addAnswer(a2); q1.addAnswer(a3); s.save(q1);
关键说明
双向一对多关联中,必须同时维护两端的关联关系:
- Answer对象要关联到Question
- Question的集合要包含对应的Answer对象
只有这样Hibernate才能识别到关联关系,触发CascadeType.ALL对应的级联插入操作。
内容的提问来源于stack exchange,提问作者mansubba2022
相关产品推荐
相关产品推荐

