私は休止状態のアプリケーションを継承しており、問題が発生しました。このコードは、1対多の関係で子を保存しないようです。双方向ですが、親オブジェクトの保存時に子を保存していないようです。
この場合、Questionクラスが親です。
// 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を呼び出すと、Questionは保存されますが、Questionオブジェクトの子であるAnswerValueは保存されません。
助言がありますか?
手動で行うか、カスケードプロパティを注釈に追加する必要があります(例: 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;
}
QuestionエンティティとAnswerエンティティの間に1対多の関係がある場合、なぜ使用しているのですか。
@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;
}