2012-11-07 35 views
11

Odziedziczyłem aplikację hibernacji i pojawiły się problemy. Wydaje się, że kod nie zapisuje dziecka w relacji jeden do wielu. Jest dwukierunkowy, ale przy zapisie obiektu nadrzędnego nie wydaje się, aby zapisać dziecko.W jaki sposób hibernacja zapisuje adnotacje jeden-do-wielu/wiele-do-jednego? (Dzieci nie oszczędzają)

Klasa pytań jest w tym przypadku rodzica.

// 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; 
    } 
} 

OdpowiedzValue jest klasą dla dzieci.

// 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; 
    } 
} 

A DAO:

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

Wydaje się, gdy zgłoszę saveOrUpdateAll, pytanie jest zapisany, ale AnswerValue że są dziećmi przedmiotu pytań nie są.

Wszelkie sugestie?

Odpowiedz

4

Dla oneToMany związek, proszę określić adnotacji cascade mapowania jako:

Cascade={CascadeType.ALL} 

lub

 Cascade={ CascadeType.ALL, CascadeType.DELETE_ORPHAN } 

W swoim mapowania:

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

Jeśli masz relacji jeden-do-wielu między Pytania i odpowiedzi podmioty, to dlaczego używasz:

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

myślę, że należy użyć zamiast tego:

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