我可以使用 JPA 将对象类型映射到 table 吗?

Can I map Object type to table using JPA?

我使用 xjc 创建了一个代表目录的模型 class。它被注释为与 jax-b 和 jpa 一起使用。因为它模拟一个目录,一个目录可以同时包含文档(文件)和其他目录,所以 class 属性之一是:

@XmlElements({
    @XmlElement(name = "dir", type = Dir.class),
    @XmlElement(name = "document", type = Document.class)
})
protected List<Object> dirOrDocument = new ArrayList<>();

您可以看到我有一个对象列表,它可以是目录或文档的实例 class。这对于使用 jax-b 编组到 xml 非常有效,但是如果我想使用 JPA 将其保存到数据库,我将如何告诉 JPA 测试对象是否为 instanceof Dir,写入 Dir table。如果Object是instanceof Document,写入文档table?

我研究过使用 JPA AttributeConverter,但看起来不太有前途,因为它似乎可以从一种类型转换为另一种类型,但我需要潜在地转换为多种类型。

也许有另一种方法可以更好地用于 JAXB 和 JPA 来表示我的模型?

我正在为 JAXB 和 JPA 实现使用 eclipselink。

要么使它成为两个独立的关联(subDirectoriesdocuments),要么创建一个包含公共字段(name 的抽象实体(例如 File) , parentDirectory, 等), 以及两个子类 DirectoryDocument.然后阅读Hibernate手册中关于继承的章节,了解映射继承的各种方式。

更新:我能够按照 JB Nizet 的建议使用继承来解决这个问题。我这样创建了一个抽象实体 class:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@XmlTransient
public abstract class CNode {

@Id
@GeneratedValue
@Column(name = "nodeId")
@XmlTransient
protected int nodeId;

// getters and setters
}

并将列表转换为:

@XmlElements({
    @XmlElement(name = "dir", type = Dir.class),
    @XmlElement(name = "document", type = Document.class)
})
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.LAZY, orphanRemoval=true)
protected List<CNode> dirOrDocument = new ArrayList<>();

然后我让我的 Dir.class 和 Document.class 扩展了我的 CNode.class。现在一切都可以使用 jaxb 和 jpa。