0

EclipseLink と Apache Derby を使用するアプリケーションに JPA を使用しています。@ManyToMany 関係に 2 つのエンティティがあります。

@Entity
class HIT<TaskType> {
   ...
   @ManyToMany(targetEntity=Task.class, mappedBy="hits")
   protected List<TaskType> tasks = Lists.newArrayList();
}

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
abstract class Task {
    ...
    @ManyToMany(targetEntity=HIT.class)
    protected List<HIT<?>> hits = Lists.newArrayList();
}

EventPresenceTask最初に、 のサブクラスであるエンティティの 2 つのタスクを作成しTask、それらを永続化します。その後、EntityManager にクエリを実行してこれらのタスクを回復し、それらを使用してEventPresenceHITのサブタイプであるのインスタンスを作成しますHIT。HIT が作成されると、両方のタスクがそのtasksリストに追加され、それ自体hitsが各タスクのリストに追加されます。その後、永続化されます。

EntityManagerオブジェクトを作成した後、最初にfor allHITをクエリして出力し、次にEntityManagerfor allをクエリして出力することで、すべてをチェックしますTask。私は得る:

EventPresenceHIT{...  #tasks=2}
EventPresenceTask{... # hits=1}
EventPresenceTask{... # hits=1}

予想通り。しかし、アプリケーションを閉じてデータベースをリロードすると、次のようになります。

EventPresenceHIT{... #tasks=0}
EventPresenceTask{... #hits=1}
EventPresenceTask{... #hits=1}

プログラムの最初の実行では、への新しいクエリですべてが正しいように見えるので、(プログラムが Ctrl-C で終了するため) がデータベースにフラッシュされていないのではないEntityManagerかと心配していたので、シャットダウン フックEntityMangerを入れました。entityManager.close()安全性を高めるために

更新: 永続化され関連しているものは、サブクラスのインスタンスであり、それ自体がエンティティであることを明確にするHITためTask

4

1 に答える 1

0

HITばかげた間違い -クラスの継承戦略に注釈を付けるのを忘れていました。その後、DB の作成が例外でクラッシュしました。JOINEDただし、両方のクラスの継承戦略に切り替えると機能します。

于 2013-11-04T13:57:43.343 に答える