我正在将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
放在一个关机钩子中是为了更安全,但它没有帮助。
已更新:要明确保留和相关的内容是EntityManger
和entityManager.close()
的子类实例,这些子类本身就是实体。
答案 0 :(得分:0)
愚蠢的错误 - 我忘记在HIT
类上注释继承策略。在我这样做之后,数据库创建崩溃了例外。但是,切换到两个类的JOINED
继承策略都可以。