2012-04-03 93 views
0

我正在使用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會發出更新查詢。

更新:我是個白癡。短語和字母之間的關係是多對多的,我實際上得到了一個例外,因爲我違反了關鍵約束。

回答

1

你是如何創建你的關係。下面的代碼在你的案例中似乎適用。

LetterEntity letter = new LetterEntity(); 
    PhraseEntity phrase = new PhraseEntity(); 
    SentenceEntity sentence = new SentenceEntity(); 

    sentence.getLetters().add(letter); 
    s.persist(sentence); 
    phrase.getLetters().add(letter); 
    s.persist(phrase); 
+0

所以我堅持這句話,堅持把它的句子設置爲'sentence',然後我把這個字母加到這個短語中。也許這就是問題所在。 – schmmd 2012-04-03 22:43:30