2016-05-19 4 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, где используется список.

(BTW Я полагаю, класс ComponentChild расширяет ComponentParent.)

+0

Привет, вы правы. ComponentChild расширяет ComponentParent (я исправил его). Я обновил вопрос так, как я хочу иметь дело с типом объекта. Я хочу реализовать Container, который знает о конкретном типе компонента. –

0

Я не уверен, если вы можете достигнуть того легко с Hibernate/JPA. Мне было бы интересно, если вы найдете решение.

Однако, если это до меня, я бы, вероятно, сделать что-то, как показано ниже:

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

} 

Тогда может быть другой

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

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

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

} 

где OtherComponent расширяет ComponentParent.

Смежные вопросы