我有一个包含可访问元素列表的管理器类,我想使用 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);
}
}
我尝试了多种方法。我试图将 AbstractElement 标记为@MappedSuperclass,但是 Hibernate 无法找出正确的 Visitable 类型,并且不允许我用 @OneToMany(targetEntity=AbstractElement.class) 标记它。我曾尝试更改 List 以包含 AbstractElement,但 Hibernate 提示它无法实例化抽象类。我还尝试在 AbstractElement 类上使用 TABLE_PER_CLASS 继承策略,但得到了相同的“无法实例化”错误。
我能做些什么来解决这个问题吗?这完全可行吗?
我在这个处理 jpa 和继承的网站上搜索了许多类似的问题,但没有一个建议有效。
更新: 所以看起来问题不在于继承方法或抽象类本身,而是因为我试图使用 EntityManager::merge() 而不是 EntityManager::persist()。我认为这与合并生成实体副本这一事实有关。
那么根据这些新知识,我是否只需要承认合并不能用于抽象类的集合?或者有什么方法可以添加 hibernate 可以调用的复制构造函数?
最佳答案
你需要告诉 JPA/Hibernate List 的内容类型是一个 Entity
(因此它不能是一个 Interface 而需要是一个抽象类),List 代表了一个关系Elements 和 AbstractElement(使用 @OneToMany
)以及您的 super 元素需要标记为类层次结构的顶级元素 (@Inheritance
)。继承策略独立于此,因此是任意的(默认为 SINGLE_TABLE):
@Entity
class Elements {
@OneToMany
List<AbstractElement>
}
@Entity
@Inheritance
class abstract AbstractElement implements Visitable {}
关于java - 如何使用 JPA 2.0 保留子类型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305860/