19

Hibernateアプリケーションを継承しましたが、問題が発生しました。コードは子供を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は保存されていません。

助言がありますか?

4

3 に答える 3

8

手動で行うか、カスケードプロパティをアノテーションに追加する必要があります。つまり、Hibernate:カスケードタイプ

またはHibernate:アノテーションでカスケードをどのように使用しますか?

于 2012-11-07T02:13:59.690 に答える
7

関係については、マッピングアノテーションを次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;
    }
于 2012-11-07T02:13:42.433 に答える
4

質問エンティティと回答エンティティの間に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;
}
于 2012-11-07T02:31:15.333 に答える