我将 JPA 用于带有 EclipseLink 和 Apache Derby 的应用程序。我在@ManyToMany 关系中有两个实体:
@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
,一个子类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}
由于在程序的初始运行中对新查询的一切似乎都是正确的EntityManager
,我担心EntityManger
没有刷新到数据库(因为程序被 Ctrl-C 终止),所以我放入entityManager.close()
了一个关闭挂钩为了更加安全,但它没有帮助。
更新:为了明确被持久化和相关的是子类的实例,HIT
它们Task
本身就是实体。