2012-10-07 29 views
0
@Entity 
class Question{ 
    @Id 
    private int id; 
    private String questionText; 

    @OneToMany 
    Set<AnswerOption> answerOptions; 
} 

class AnswerOption{ 
    private String option; 

    @ManyToOne 
    private Question question; 
} 

table-columns: 
Question: id, text 
AnswerOption: question_id, option 

example: 
Question: Which county are you from? 
Possible answers: Kent, Essex, Middlesex, Others 


Intended api usage: 
Question q = new Question("Which county are you from?"); 
q.addAnswerOption(new AnswerOption("Kent")) 
q.addAnswerOption(new AnswerOption("Essex")) 
q.addAnswerOption(new AnswerOption("Middlesex")) 
q.addAnswerOption(new AnswerOption("Others")) 
questionDao.save(q); 

我不需要AnswerOption的標識符,因爲我認爲AnswerOption是一個Value對象。有人可以推薦如何使用JPA來堅持這個模型,因爲我不確定用於AnswerOption類的註釋嗎?Jpa:存儲由實體組成的Value對象的集合

謝謝。

+0

如果您已經擁有OO模型,您就擁有它(JPA的目的是自動執行該工作)。現在,這是**真正的問題**? – SJuan76

+0

,你可以看到我沒有用相關的JPA註解標記AnswerOption類,因爲我不知道如何使用JPA存儲值對象。 – Rag

回答

3

我會說,使你的AnswerOption類也作爲實體。

@Entity 
class AnswerOption{ 
    private String option; 

    @ManyToOne 
    private Question question; 
} 

變化oneToMany映射Question類使用CASCADE選項如下:

@Entity 
class Question{ 

    @Id 
    private int id; 
    private String questionText; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy="question") 
    Set<AnswerOption> answerOptions; 
} 

一旦這樣做,你的問題對象保存如下:

//get your hibernate session 
Session session = .... 
Question q = new Question("Which county are you from?"); 
q.addAnswerOption(new AnswerOption("Kent")) 
q.addAnswerOption(new AnswerOption("Essex")) 
q.addAnswerOption(new AnswerOption("Middlesex")) 
q.addAnswerOption(new AnswerOption("Others")) 

//use session to save the Question with AnswerOptionss 
session.save(q); 

確保您addAnswerOption方法Question如下:

public void addAnswerOption(AnswerOption answerOption){ 
    //setting the question as parent in answerOption 
    answerOption.setQuestion(this). 
    this.answerOptions.add(answerOption); 
} 
+0

我相信你的解決方案會起作用。但我不認爲AnswerOption應該是一個實體。它也與問題的生命週期有關。感謝回覆。 – Rag

+0

我覺得'AnswerOption'也是一個帶有'question_id'和'option'列的表。爲什麼你認爲它不應該是一個實體?如果您注意到,在處理示例中,您只處理'Question',即'session.save(question)'和'AnswerOption'在內部得到關注。同樣,你可以使用'question'來執行'update','delete','retreive'。 –

+0

這是'父母 - 孩子'的簡單場景,其中'Question'是父表,'AnswerOption'是子表。據瞭解,小孩離不開父母。這也可以通過在'Question'表中的'id'列的'AnswerOtption'表中定義'foreign-key'到'question_id'來實現。 –