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...
}

そして、これが Folder クラスです。

@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 クラスの "folders" および "test" プロパティに対するトリッキーなマッピングがある可能性があり、それについて少し助けが必要です。

編集: targetEntity=Node.class を使用して、Folder クラスのフォルダーとテストの両方のプロパティを指定しました。

    @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 にしたくない可能性が高いため、new を追加する必要があります。そして、ノードとフォルダーの間に配置する必要があります: フォルダー->マップされたスーパークラス->ノード。次のようになります (このようなアプローチは、少なくとも 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 bit は Parent に対して一般的すぎませんか? 少なくとも、この目的のみに使用される場合。すべての親はフォルダーです。

于 2011-10-03T19:20:45.940 に答える