【发布时间】:2012-03-07 12:44:54
【问题描述】:
我有一个包含可访问元素列表的管理器类,我想使用 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可以调用的复制构造函数?
【问题讨论】:
标签: java hibernate persistence jpa-2.0