2012-06-07 281 views
0

我有兩個實體:EJB 3持久性

語料庫實體:

@Entity(name = "CORPUS") 
public class Corpus implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @OneToMany(mappedBy = "corpus", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Collection<CorpusHistory> corpusHistories; 

    //Setters and getters... 
} 

語料庫歷史實體:

@Entity(name = "CORPUS_HISTORY") 
public class CorpusHistory implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="CORPUS_ID") 
    private Corpus corpus; 

    //Setters and getters... 
} 

語料庫實體可以有文集許多歷史記錄所以我用@OneToMany註釋它。我希望使用語料庫標識完成映射,因此我正在使用語料庫歷史記錄實體中的@JoinColumn(name="CORPUS_ID")@ManyToOne註釋。

堅持語料對象數據庫之前我胼病史採集設置它:

LinkedList<CorpusHistory> corpusHistories = new LinkedList<CorpusHistory>(); 
for (Change change : changes) { 
    CorpusHistory corpusHistory = new CorpusHistory(); 
    //corpusHistory.setCorpusId(String.valueOf(corpusId)); ????? 
    corpusHistory.setRevisionAuthor(change.getName()); 
    corpusHistory.setRevisionDate(change.getWhen()); 
    corpusHistory.setRevisionNote(change.getNote()); 
    //corpusHistoryFacade.create(corpusHistory); 
    corpusHistories.add(corpusHistory); 
} 

corpus.setCorpusHistories(corpusHistories); 

記錄被創造的一切是確定,但在語料庫歷史表中的列CORPUS_ID始終爲空。當我從數據庫檢索語料庫時,歷史列表是空的。我不明白如果語料庫記錄尚未創建,我怎麼能指定語料庫ID到語料庫歷史?

這不是EJB工作要做的嗎?使用@OneToMany@ManyToOne映射,適當的ID應映射並存儲到適當的列中(在這種情況下,語料庫ID應存儲在語料庫歷史記錄列CORPUS_ID的每個記錄中)。

或者我在這裏誤解了一些東西?我已經嘗試過很多教程,但沒有成功......我被困在這裏。

回答

1
for (Change change : changes) { 
    CorpusHistory corpusHistory = new CorpusHistory(); 
    corpusHistory.setCorpus(corpus); 
    ... 
} 

所有者方是沒有mappedBy屬性的一方。您必須初始化所有者端,以告知JPA該關聯存在。由於您在corpus.histories上進行了級聯,因此當您堅持使用語料庫時,JPA還會保留歷史記錄。

+0

是的,你是對的,我花了整整一天的時間...現在一切都像魅力:)謝謝。 –