我正在使用hibernate並正在編寫代碼來填充空數據庫。讓我們假裝我堅持句子,短語和字母。由於字母出現在短語和句子中,因此我要讓每個LetterEntity
對其SentenceEntity
和每個SentenceEntity
都有一個字母集合。Hibernate:在持久集合中重用持久化類
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.LAZY)
@JoinColumn(name="sentenceid")
@Sort(type=SortType.NATURAL)
public SortedSet<LetterEntity> getLetters() {
return this.letters;
}
到目前爲止沒有問題。由於我也想PhraseEntity
有一個字母和短語的子集可能重疊,一個字母可能在多個短語。爲此,我需要一個額外的關係表。
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name = "phrase_letters", joinColumns = @JoinColumn(name = "phraseid"), inverseJoinColumns = @JoinColumn(name = "letterid"))
@Sort(type=SortType.NATURAL)
public SortedSet<TypeEntity> getLetters() {
return this.letters;
}
當我填充數據庫,我只設置將其添加到在句子集合函的setSentenceId
。但是,當我還使用setLetters
將該字母添加到該短語中時,Hibernate會再次嘗試持續該信件,並且我得到一個異常。如何在沒有Hibernate的情況下將信件添加到短語中再試圖保留它?
更新:我發現它非常有助於閱讀有關雙射關聯。
http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#collections-bidirectional
雖然不是我的問題的一部分,我有許多雙射協會成立。我發現它們是必要的,因爲它使批量插入速度更快。將元素添加到集合時,Hibernate會發出更新查詢。
更新:我是個白癡。短語和字母之間的關係是多對多的,我實際上得到了一個例外,因爲我違反了關鍵約束。
所以我堅持這句話,堅持把它的句子設置爲'sentence',然後我把這個字母加到這個短語中。也許這就是問題所在。 – schmmd 2012-04-03 22:43:30