JPA的@OneToMany如何在运行时知道Generic实体类型

时间:2013-10-04 09:22:29

标签: java generics jpa

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

@OneToMany(mappedBy="student")
private Collection<Qualification> qualification;

然而,正如我理解泛型和类型擦除,在运行时所有可能看到的是这是一个集合而不是资格集合 - 因为据我所知,泛型类型已经在这里被删除。

这是如何工作的?我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

你错过了这个注释的另一部分:

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

<强>更新

在JPA中,如果为所有继承的类设置表,则会出现名为@DiscriminatorColumn的内容。您还可以为每个conreete类指定一个表。

http://en.wikibooks.org/wiki/Java_Persistence/Inheritance