0

我正試圖用JPA實現一些樹狀結構。 我有一個「文件夾」實體和一個「測試」實體。文件夾可以包含文件夾和測試。測試不包含任何東西。JPA中的超類實體屬性的雙向關係

兩種測試和文件夾中有一個節點超,看起來是這樣的:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Node implements TreeNode, Serializable{ 

    private Long id;  
    String description;  
    String name; 

    @ManyToOne 
    Node parent; 

    ...getters, setters and other stuff that doesnt matter... 
} 

這裏是文件夾類:

@Entity 
public class Folder extends Node{ 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(cascade=CascadeType.ALL, **mappedBy="parent"**) 
    List<Folder> folders; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(cascade=CascadeType.ALL, **mappedBy="parent"**) 
    List<Test> tests; 

    ... 
} 

所以,主要的問題是mappedBy屬性,它涉及到父類屬性在祖先中沒有被覆蓋,導致我得到這樣的異常:

Exception while preparing the app : mappedBy reference an unknown target entity property: my.test.model.Folder.parent in my.test.model.Folder.folders 

Folder類的「文件夾」和「測試」屬性可能存在一些棘手的映射,我需要一些幫助。

編輯:我指定的文件夾和與targetEntity = Node.class文件夾類的測試性能:

@LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(cascade=CascadeType.ALL, mappedBy="parent",targetEntity=Node.class) 
    List<Folder> folders; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(cascade=CascadeType.ALL, mappedBy="parent",targetEntity=Node.class) 
    List<Test> tests; 

而且其得到的工作。但工作不好。現在測試和文件夾映射到屬性(我不知道爲什麼我不geting例外),當我需要分開得到它們。

所以我仍然在尋找一個合適的映射來實現這一點。我會appriciate任何幫助。

回答

0

有趣的結構,可能包含許多挑戰。但是關於與超類實體屬性的關係問題:不幸的是,你不能用Hibernate來實現。你設置targetEntityClass的方法也不起作用,因爲它從實體映射的角度有效地改變了集合元素的類型。

幸運的是有解決方法。您可以將實體與MappedSuperClass的屬性進行關聯,您可以擴展該屬性。可能你不想讓Node成爲MappedSuperClass,所以你必須添加新的。然後它必須位於節點和文件夾之間:Folder-> MappedSuperClass-> Node。它是這樣的(這種方法適用至少與Hibernate 3.5.6,不知道從哪個版本是支持):

public class Node { 
     ... //without parent attribute, otherwise as before 
} 

@MappedSuperclass 
public class SomethingWithParent extends Node { 
    @ManyToOne 
    Node parent; 
} 
public class Folder extends SomethingWithParent { 
.. 
//as before 
} 

public class Test extends SomethingWithParent { 
...//as before 
} 

順便說一句,是不是有點節點過於普通的家長?至少如果它僅用於此目的。所有父母都是文件夾。

+0

感謝您的回覆,我會試試這個。 – user976426

+0

節點統一了文件夾和測試常用的幾個字段,例如名稱,說明,所有者等。另一方面,我試圖實現Swing提供的TreeNode接口(因爲RichFaces可以使用它),所以這個結構對我來說更加簡單。 – user976426