Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA';s@OneToMany在运行时知道泛型实体类型_Java_Generics_Jpa - Fatal编程技术网

Java JPA';s@OneToMany在运行时知道泛型实体类型

Java JPA';s@OneToMany在运行时知道泛型实体类型,java,generics,jpa,Java,Generics,Jpa,根据@OneToMany上的JavaDoc,如果“collection属性是使用Java泛型定义的”,则不需要指定targetEntity。除此之外,您不需要在构造时实例化集合属性,但可以将其保留为null。例如: @OneToMany(mappedBy="student") private Collection<Qualification> qualification; @OneToMany(mappedBy=“student”) 私人收藏资格; 然而,正如我对泛型和类型擦除的

根据@OneToMany上的JavaDoc,如果“collection属性是使用Java泛型定义的”,则不需要指定targetEntity。除此之外,您不需要在构造时实例化集合属性,但可以将其保留为null。例如:

@OneToMany(mappedBy="student")
private Collection<Qualification> qualification;
@OneToMany(mappedBy=“student”)
私人收藏资格;
然而,正如我对泛型和类型擦除的理解,在运行时可以看到的是,这是一个集合,而不是一个限定的集合——因为据我所知,泛型类型已经在这里被擦除了


这是怎么回事?我遗漏了什么?

您遗漏了此批注的内容部分:

使用
mappedBy=“student”
定义了可能的类,因为您正在“链接”到另一个数据库表。该表也有一个Java绑定。因此,JPA将尝试从N表中创建一个对象,并将它们添加到列表中

更新

在JPA中,如果为所有继承的类设置一个表,则有一个称为
@DiscriminatorColumn
。还可以为每个conreete类指定一个表


感谢Thomas W指出这一点。您可以使用反射,使用Method.getGenericReturnType()和Field.getGenericType()从类的方法和字段中获取泛型类型信息,这将提供足够的信息来知道需要在这里做什么。

那么,如果将多个实体映射到同一个表,它是如何工作的呢?例如,如果您使用的是单表继承,或者只是使用更简单的实体来简化代码或提高代码性能。或者它不起作用,在这种情况下,这只是一个通常不好的主意?实际上,更多地使用它,@OneToMany注释上的mappedBy定义了要映射到目标实体上的列名,这仍然无法解释它如何首先知道目标实体是什么……实际上是在运行时,可以通过
method.getGenericParameterTypes()
getGenericReturnType()
获取方法参数和返回类型的泛型类型,但不能从任意变量或对象引用获取。例如,Spring将这种技术用于数据绑定,但这是一个变量,而且——据我所知——您可以使用字段级绑定,而不需要getter或setter来对此字段可用,因此没有一种方法可以检查此元数据。然而,我不知道你能用方法做到这一点,所以知道这一点也很有用:)啊哈——我想我明白了。您还可以对java.lang.reflect.Field对象执行getGenericType(),这将为您提供类字段的泛型类型信息,这意味着我们知道要查看的内容。