2016-05-19 12 views
0

Hibernateマッピングでワイルドカードを使用してジェネリックコレクションを管理する最適な方法は何ですか? たとえば、ComponentParent,ComponentChildおよびContainerクラスがあります。私は下の例をしようとすると、私はエラーを取得する:ワイルドカードとHibernateを使用した汎用コレクション

Caused by: org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity() defined 

は、エンティティは、あなたが「ワイルドカードを持つジェネリックコレクション」として、それを維持したいのはなぜ

@Entity 
@Inheritance 
@DiscriminatorColumn(name = "TYPE") 
@Table(name = "COMPONENT") 
class abstract ComponentParent { 
    private Long id; 

    ... 
} 

@Entity 
@DiscriminatorValue(name = "CHILD") 
class ComponentChild extends ComponentParent { 
    ... 
} 

@Entity 
@Table(name = "CONTAINER") 
class abstract Container { 
    private Long id; 

    @OneToMany 
    @JoinColumn(name = "containerId") 
    private List<? extends ComponentParent> components; 
} 

@Entity 
@DiscriminatorValue("CONC") 
class ConcreteContainer { 

    public List<ChildComponents> getComponents() { 
     return components; 
    } 

} 

答えて

1

ですか?あなたはそれにアクセスすると、あなたはそれぞれのオブジェクトを型に基づいて扱ういくつかの論理を持っている必要がありますか?

あなたは

private List<ComponentParent> components; 

としてコンテナ内のコンポーネントのリストを維持し、リストが使用されているComponentXXXのタイプに基づいた戦略を使用することはできません。

(ちなみに私はクラスComponentChildがComponentParentを拡張すると仮定します。)

+0

こんにちはあなたは正しいComponentChildはComponentParentを拡張しています(私はそれを修正しました)。私はオブジェクトタイプを扱う方法で質問を更新しました。具体的なコンポーネントタイプを知っているContainerの実装が必要です。 –

0

私はあなたが休止状態/ JPAで簡単にそれをacheiveことができるかどうかはわかりません。あなたも解決策を見つけたら、私は興味があります。それは私次第だ場合

しかし、私はおそらく以下のような何かをしたい:

@Entity 
@Inheritance 
@DiscriminatorColumn(name="xxx") 
@Table(name = "CONTAINER") 
class abstract Container { 
    private Long id; 

    abstract public List<? extends ComponentParent> getComponents(); 
} 

@Entity 
@DiscriminatorValue("CONC") 
class ConcreteContainer { 

    @OneToMany 
    @JoinColumn(name = "containerId") 
    private List<ChildComponents> components; 

    @Overrides 
    public List<ChildComponents> getComponents() { 
     return components; 
    } 

} 

はその後OtherComponentがComponentParentを拡張し、別の

@Entity 
@DiscriminatorValue("CONC2") 
class ConcreteContainer2 { 

    @OneToMany 
    @JoinColumn(name = "containerId") 
    private List<OtherComponents> components; 

    @Overrides 
    public List<OtherComponents> getComponents() { 
     return components; 
    } 

} 

があるかもしれません。

関連する問題