2012-11-07 3 views
11

Ich habe eine Winterschlaf-Anwendung geerbt und ich habe Probleme festgestellt. Es scheint, dass der Code das Kind nicht in einer Eins-zu-Viele-Beziehung speichert. Es ist bidirektional, aber beim Speichern des übergeordneten Objekts scheint es das Kind nicht zu speichern.Wie speichert Hibernate One-to-Many-/Many-to-One-Annotationen? (Kinder sparen nicht)

Die Question-Klasse ist in diesem Fall das übergeordnete Element.

// 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 ist die untergeordnete Klasse.

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

Und die DAO:

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

Es scheint, als ich saveOrUpdateAll nennen, Frage ist gespeichert, aber die AnswerValue, die Kinder der Frage Objekts nicht.

Irgendwelche Vorschläge?

Antwort

4

Für oneToMany Beziehung definieren Sie bitte die cascade Mapping Annotation:

Cascade={CascadeType.ALL} 

oder

 Cascade={ CascadeType.ALL, CascadeType.DELETE_ORPHAN } 

In Ihrem Mapping:

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

Wenn Sie eine Eins-zu-viele-Beziehung zwischen der Frage & Antwort Entitäten, warum verwenden Sie:

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

Ich glaube, Sie diese stattdessen verwenden sollten:

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