我使用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实现。
答案 0 :(得分:1)
将其设为两个单独的关联(subDirectories
和documents
),或者创建一个包含公共字段(File
,{name
的抽象实体(例如parentDirectory
) {1}}等,以及两个子类Directory
和Document
。然后阅读有关继承的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。