重新加载数据库时,JPA @ManyToMany关系仅保存在一侧

时间:2013-11-01 17:35:02

标签: java jpa eclipselink derby

我正在将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的{​​{1}}并打印它们,然后查询所有HIT的{​​{1}}并打印,检查所有内容那些。我明白了:

EntityManager

正如所料。但是,如果我关闭应用程序并重新加载数据库,我会得到:

Task

由于在初始运行程序中对EventPresenceHIT{... #tasks=2} EventPresenceTask{... # hits=1} EventPresenceTask{... # hits=1} 的新查询中的所有内容都显示正确,我担心EventPresenceHIT{... #tasks=0} EventPresenceTask{... #hits=1} EventPresenceTask{... #hits=1} 没有刷新到数据库(因为程序已终止)通过Ctrl-C),所以我把EntityManager放在一个关机钩子中是为了更安全,但它没有帮助。

已更新:要明确保留和相关的内容是EntityMangerentityManager.close()的子类实例,这些子类本身就是实体。

1 个答案:

答案 0 :(得分:0)

愚蠢的错误 - 我忘记在HIT类上注释继承策略。在我这样做之后,数据库创建崩溃了例外。但是,切换到两个类的JOINED继承策略都可以。