java - 如何使用 JPA 2.0 保留子类型列表?

标签 java hibernate persistence 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);
  }
}

我尝试了多种方法。我试图将 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/

相关文章:

java - 将字符串文字 unicode 打印为实际字符

java - 使用 hibernate 创建 MySQL 表的问题

java - 管理交易的最佳方式

java - Hibernate,从OneToMany列表中获取用户

database - 如何在 mod_perl 中拥有 DBIC 持久数据库连接?

Java:字符串拆分为多个元素

java - 函数 powRec(x,n-1) 如何执行求幂?

java - 可观察超时

java - 将属性添加到 javax.persistence 实体

java - Google App Engine 中的自有关系不起作用