0

我将 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每个任务的列表中。然后它被持久化。

创建对象后,我首先查询EntityManagerfor allHIT并打印它们,然后查询EntityManagerfor 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本身就是实体。

4

1 回答 1

0

愚蠢的错误 - 我忘记在HIT类上注释继承策略。在我这样做之后,数据库创建因异常而崩溃。但是,切换到JOINED两个类的继承策略都有效。

于 2013-11-04T13:57:43.343 回答