2012-11-07 12 views
11

Ho ereditato un'applicazione di ibernazione e ho riscontrato problemi. Sembra che il codice non salvi il bambino in una relazione uno-a-molti. È bidirezionale, ma al salvataggio di un oggetto genitore non sembra salvare il bambino.In che modo ibernare salva le annotazioni one-to-many/many-to-one? (I bambini non salvano)

In questo caso, la classe di domande è il genitore.

// 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 è la classe figlio.

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

E il DAO:

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

Sembra quando chiamo saveOrUpdateAll, domanda viene salvato, ma l'AnswerValue che sono elementi secondari dell'oggetto questione non sono.

Qualche suggerimento?

risposta

4

Per oneToMany rapporto, si prega di definire l'annotazione cascade mappatura come:

Cascade={CascadeType.ALL} 

o

 Cascade={ CascadeType.ALL, CascadeType.DELETE_ORPHAN } 

Nella tua mappatura:

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

se si dispone di una relazione uno-a-molti tra la domanda e risposta entità, allora perché stai usando:

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

Credo che si dovrebbe utilizzare questo invece:

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