2014-01-02 4 views
1

Я использую JPA дискриминаторы для получения конкретных классов суб следующим образом (имена классов изменены для простоты)Как явно указать «обратную» связь @OneToMany в JPA

@Entity 
@Table(name="TYPE") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="SUB_TYPE", discriminatorType=DiscriminatorType.INTEGER) 
public class Type { 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="TID") 
    private Foo foo; 
} 

@Entity 
@DiscriminatorValue("1") 
public class Type1 extends Type { 
    //Type1 stuff 
} 

//Other Type subclasses 

Как вы можете видеть класс «Тип» в многие-к-одному с классом Foo, однако в дженериков как Set<Type1> не является подтипом Set<Type> мы не можем просто speicify на «обратную» связь в Foo, как Set<Type> types;

Поэтому мой класс Foo использует символы, но и гарантирует, что только подклассы типа могут быть установлены как типы следующим образом;

@Entity 
@Table(name="FOO") 
public class Foo { 

    //bi-directional one-to-many association to Type 
    @OneToMany(mappedBy="foo") 
    Set<?> types; 

    public Set<?> getTypes() { 
      return types; 
    } 

    public void setTypes(Set<? extends Type> types) { 
      this.types = types; 
    } 
} 

Вопрос в том, как я могу прямо сказать JPA, что Set должен быть типа «Тип»? Если это невозможно, каковы мои альтернативы настройке этой обратной связи, но при этом используются дискриминаторы?

ответ

1

OneToMany аннотаций можно указать targetEntity:

@OneToMany(mappedBy="foo", targetEntity = Type.class) 
    Set<?> types; 

Это не является обязательным, когда дженерики могут быть использованы для определения типа, но требуется в вашей ситуации.

http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html

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