如何在JPA中明确指定“反向”@OneToMany关系

时间:2014-01-02 08:00:59

标签: java generics jpa eclipselink

我正在使用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>的子类型,我们不能只是表示' Foo中的反向关系为Set<Type> types;

因此我的Foo类使用通配符,但也确保只能将Type的子类设置为类型,如下所示;

@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应该是'Type'类型?如果这是不可能的,那么在设置这种反向关系的同时还有什么选择,同时仍然使用鉴别器?

1 个答案:

答案 0 :(得分:1)

OneToMany注释可以指定targetEntity:

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

当可以使用泛型来定义类型时,这是可选的,但在您的情况下是必需的。

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