java - 如何在JPA中显式指定 'inverse' @OneToMany关系

标签 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

如您所见,“Type”类与 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”类型?如果这是不可能的,那么在仍然使用鉴别器的情况下,我有什么替代方案来设置这种逆关系?

最佳答案

OneToMany注解可以指定targetEntity:

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

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

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

关于java - 如何在JPA中显式指定 'inverse' @OneToMany关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20878702/

相关文章:

java - Google map GWT 不适合容器尺寸

java - 在java中清除没有排除文件的目录

java - Jsp扩展页面指令异常: Unable to compile class for JSP:

generics - 有没有办法表达具有不同生命周期界限的 "same"泛型类型?

在内部类中使用泛型参数时 Java 编译失败

hibernate - JPA和Hibernate级联之间的混淆

spring - 如何使用 Spring Data JPA 方法在 Kotlin 的 try-with-resources block 中返回 Stream?

java - 从数据库加载数据时发生StackOverflowError

C#泛型类定义解释

java - org.hibernate.exception.SQLGrammarException : hibernate will not join column