0

我想用 JPA 实现一些树状结构。我有一个“文件夹”实体和一个“测试”实体。文件夹可以包含文件夹和测试。测试不包含任何内容。

test 和 folder 都有一个 Node 超类,如下所示:

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

它得到了工作。但工作不正常。现在,当我需要分别获取它们时,测试和文件夹都映射到这两个属性(我不知道为什么我没有得到异常)。

所以我仍在寻找合适的映射来实现这一目标。我会给予任何帮助。

4

1 回答 1

0

有趣的结构,可能包含许多挑战。但是关于与超类实体属性的关系的问题:不幸的是,你不能用 Hibernate 做到这一点。您设置 targetEntityClass 的方法也不起作用,因为它从实体映射的角度有效地更改了集合元素的类型。

幸运的是,有解决方法。您可以将实体与您扩展的 MappedSuperClass 的属性建立关系。可能你不想让 Node 成为 MappedSuperClass,所以你必须添加新的。然后它必须位于 Node 和 Folder 之间: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
}

顺便说一句,Node 对 Parent 来说是不是太通用了?至少如果它仅用于此目的。所有的父母都是文件夹。

于 2011-10-03T19:20:45.940 回答