Hibernate如何保存一对多 /多一对一的注释?(儿童不保存)



我已经继承了一个冬眠应用程序,并且遇到了问题。看来,代码并不能在一对一的关系中拯救孩子。这是双向的,但是在保存父对象的情况下,它似乎并不能保存孩子。

在这种情况下,问题类是父母。

// Question.java
@Entity
@SequenceGenerator(name = "question_sequence", sequenceName = "seq_question", allocationSize = 1000)
@Table(name = "question")
public class Question {
   protected Long questionId;
   protected Set<AnswerValue> answerValues;
   public TurkQuestion(){}
   public TurkQuestion(Long questionId){
      this.questionId = questionId;
   }
   @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_sequence")
   @Column(name = "question_id")
   public Long getQuestionId(){
      return questionId;
   }
   @OneToMany(fetch = FetchType.EAGER)
   @JoinColumn(name = "question_id",referencedColumnName="question_id")
   public Set<AnswerValue> getAnswerValues(){
      return answerValues;
   }
   public void setQuestionId(Long questionId){
      this.questionId = questionId;
   }
   public void setAnswerValues(Set<AnswerValue> answerValues){
      this.answerValues = answerValues;
   }
}

Answervalue是儿童班。

// AnswerValue.java
@Entity
@SequenceGenerator(name = "answer_value_sequence", sequenceName = "seq_answer_value", allocationSize = 1)
@Table(name = "answer_value")
public class AnswerValue {
    protected Long answerValueId;
    protected Question question;
    protected String answerValue;
    public AnswerValue(){}
    public AnswerValue(Long answerValueId, Long questionId, String answerValue){
       this.answerValueId = answerValueId;
       this.question = new Question(questionId);
       this.answerValue = answerValue;
    }
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "answer_value_sequence")
    @Column(name = "answer_value_id")
    public Long getAnswerValueId(){
       return answerValueId;
    }
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "question_id", nullable = false )
    public Question getQuestion(){
       return question;
    }
    @Column(name = "answer_value")
    public String getAnswerValue(){
       return answerValue;
    }
    public void setAnswerValueId(Long answerValueId){
       this.answerValueId = answerValueId;
    }
    public void setQuestion(Question question){
       this.question = question;
    }
    public void setAnswerValue(){
       this.answerValue = answerValue;
    }
}

和dao:

// QuestionDao.java
public class QuestionDao {
   public void saveOrUpdateAll(List<Question> list){
      getHibernateTemplate().saveOrUpdateAll(list);
   }
}

看来,当我打电话给saveorupdateall时,问题被保存了,但是作为问题对象的孩子的答案不是。

有什么建议?

您需要手动执行或将级联属性添加到注释中,即Hibernate:Cascade Type

或休眠:如何在注释中使用级联?

有关oneToMany关系,请定义cascade映射注释为:

    Cascade={CascadeType.ALL}

     Cascade={ CascadeType.ALL, CascadeType.DELETE_ORPHAN }

在您的映射中:

    @ManyToOne(fetch = FetchType.EAGER, 
               cascade = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    @JoinColumn(name = "question_id",referencedColumnName="question_id")
    public Set<AnswerValue> getAnswerValues(){
        return answerValues;
    }

如果问答实体之间有一对多的关系,那么您为什么要使用:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "question_id",referencedColumnName="question_id")
public Set<AnswerValue> getAnswerValues(){
    return answerValues;
}

我认为您应该使用此方法:

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "question_id",referencedColumnName="question_id")
public Set<AnswerValue> getAnswerValues(){
    return answerValues;
}