2017-05-26 122 views
1

我用xjc创建了一个表示目录的模型类。它被注释为与jax-b和jpa一起使用。由于车型的目录,目录可以同时包含文档(文件)和其他目录,以便类的属性之一是:我可以使用JPA将对象类型映射到表吗?

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

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

我已经看过使用JPA AttributeConverter,但看起来没有前途,因为它似乎从一种类型转换为另一种,但我需要潜在转换为多种类型。

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

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

回答

1

要么使其两个单独的关联(subDirectories,并documents),或创建包含公共字段(nameparentDirectory,等),以及两个子类DirectoryDocument抽象实体(File例如)。然后阅读关于继承的Hibernate手册章节,以了解映射继承的各种方法。

+0

我想我可能会尝试你提到的继承方法。这似乎是一个自然的解决方案,可能更适合jpa。 – cditcher

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 
} 

和转换的清单:

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

相关问题