the*_*man 5 java persistence hibernate jpa-2.0
我有一个管理器类,其中包含可访问元素的列表,我想使用 JPA/Hibernate 将其保留在数据库中:
@Entity
class Elements {
void accept(Visitor v) {...}
@? List<Visitable> elements; // or List<AbstractElement>
}
@? class AbstractElement implements Visitable {}
@Entity class Element1 extends AbstractElement {}
@Entity class Element2 extends AbstractElement {}
class ElementDAO {
void saveElements(Elements e, EntityManager em) {
em.persist(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了多种方法。我尝试将 AbstractElement 标记为 @MappedSuperclass,但是 Hibernate 无法找出正确的 Visitable 类型,并且不允许我用 @OneToMany(targetEntity=AbstractElement.class) 标记它。我尝试更改列表以包含 AbstractElement 但 Hibernate 抱怨它无法实例化抽象类。我还尝试在 AbstractElement 类上使用 TABLE_PER_CLASS 继承策略,并得到相同的“无法实例化”错误。
我能做些什么来解决这个问题吗?这到底可行吗?
我在这个网站上搜索了许多有关 jpa 和继承的类似问题,但没有一个建议有效。
更新:所以看来问题不在于继承或抽象类本身的方法,而在于我试图使用 EntityManager::merge() 而不是 EntityManager::persist()。我认为这与合并创建实体的副本有关。
因此,根据这些新知识,我是否只需要承认合并不能用于抽象类的集合?或者有什么方法可以添加 hibernate 可以调用的复制构造函数?
小智 4
您需要告诉 JPA/Hibernate List 的内容类型是一个Entity(因此它不能是 Interface 但需要是一个抽象类),List 表示 Elements 和 AbstractElement 之间的关系(使用@OneToMany)并且您的超级元素需要被标记为类层次结构的顶层元素 ( @Inheritance)。继承策略与此无关,因此是任意的(默认为 SINGLE_TABLE):
@Entity
class Elements {
@OneToMany
List<AbstractElement>
}
@Entity
@Inheritance
class abstract AbstractElement implements Visitable {}
Run Code Online (Sandbox Code Playgroud)