0

私は2つのエンティティを持っています:

コーパス エンティティ:

@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 列は常に null です。データベースからコーパスを取得しているとき、履歴リストは空です。コーパス レコードがまだ作成されていない場合、コーパス 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.history にカスケードがあるため、コーパスを永続化すると、JPA も履歴を永続化します。

于 2012-06-07T17:19:19.480 に答える