0

我有两个实体:

语料库实体:

@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. 我希望使用语料库 ID 完成映射,因此我在语料库历史实体中使用@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 的每条记录中)。

或者我在这里误解了什么?我尝试了很多教程,没有成功......我被困在这里。

4

1 回答 1

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

拥有者一方是没有 mappedBy 属性的一方。您必须初始化所有者方以便告诉 JPA 关联存在。由于您在 corpus.histories 上有级联,因此当您持久化语料库时,JPA 也会持久化历史记录。

于 2012-06-07T17:19:19.480 回答