我正在使用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'类型?如果这是不可能的,那么在设置这种反向关系的同时还有什么选择,同时仍然使用鉴别器?
答案 0 :(得分:1)
OneToMany注释可以指定targetEntity:
@OneToMany(mappedBy="foo", targetEntity = Type.class)
Set<?> types;
当可以使用泛型来定义类型时,这是可选的,但在您的情况下是必需的。
http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html