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

时间:2017-05-26 22:12:36

标签: java hibernate jpa jaxb eclipselink

我使用xjc创建一个表示目录的模型类。它注释用于jax-b和jpa。因为它为目录建模,所以目录可以包含文档(文件)和其他目录,因此其中一个类属性是:

sudo apt-get install libqt5multimedia5-plugins

你可以看到我有一个对象列表,它可以是Dir或Document类的实例。这对于使用jax-b编组到xml非常有用,但是如果我想使用JPA将其持久化到数据库,我将如何告诉JPA测试Object是否为Dir实例,写入Dir表。如果Object是documentof Document,请写入文档表吗?

我已经看过使用JPA AttributeConverter,但看起来很有希望,因为它似乎从一种类型转换为另一种类型,但我需要转换为多种类型。

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

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

2 个答案:

答案 0 :(得分:1)

将其设为两个单独的关联(subDirectoriesdocuments),或者创建一个包含公共字段(File,{name的抽象实体(例如parentDirectory) {1}}等,以及两个子类DirectoryDocument。然后阅读有关继承的Hibernate手册章节,了解映射继承的各种方法。

答案 1 :(得分:1)

更新:我能够通过使用JB Nizet建议的继承来解决此问题。我创建了一个抽象的实体类:

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

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

// getters and setters
}

并将List转换为:

@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。