2017-05-26 149 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。

相關問題