2016-05-19 13 views
0

Was ist die beste Möglichkeit, generische Sammlung mit Platzhalter in Hibernate Mapping zu verwalten? Zum Beispiel habe ich eine ComponentParent, ComponentChild und Container Klassen. Wenn ich das Beispiel unten versuchen, ich Fehler:Generische Sammlung mit Wildcard und Hibernate

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

Die Einheiten sind

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

} 

Antwort

1

Warum Sie es als „generische Sammlung mit Wildcard“ behalten? Wenn Sie darauf zugreifen, müssen Sie auf jeden Fall eine gewisse Logik haben, um mit jedem Objekt umzugehen, nicht wahr?

Können Sie nicht die Liste der Komponenten in Container halten als

private List<ComponentParent> components; 

und eine Strategie verwenden, basierend auf welche Art von ComponentXXX, wo die Liste verwendet wird.

(BTW gehe ich davon aus Klasse ComponentChild erstreckt ComponentParent.)

+0

Hallo, Sie haben Recht ComponentChild erweitert ComponentParent (Ich habe es korrigiert). Ich habe die Frage so aktualisiert, wie ich mit dem Objekttyp umgehen möchte. Ich möchte eine Implementierung von Container, die über konkrete Komponententyp weiß. –

0

Ich bin mir nicht sicher, ob Sie das leicht mit Hibernate/JPA acheive können. Ich wäre interessiert, wenn Sie auch eine Lösung finden.

Allerdings, wenn es an mir würde ich wahrscheinlich wie unten etwas tun:

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

} 

Dann könnte es eine andere sein

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

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

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

} 

wo anderen Komponente ComponentParent erstreckt.

Verwandte Themen