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
をクエリして出力し、次にEntityManager
for 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
。