org.hibernate.AnnotationException:Collection既没有泛型类型,也没有OneToMany.targetEntity()

时间:2011-08-04 07:57:55

标签: java hibernate annotations hibernate-tools

我使用 Hibernate Tools 来生成我的Hibernate POJO映射。

不幸的是,Hibernate工具生成的代码似乎不起作用,我得到了异常

org.hibernate.AnnotationException:Collection既没有泛型类型,也没有OneToMany.targetEntity()

生成异常的代码部分是

/**
 * ClassFlag generated by hbm2java
 */
@Entity
@Table(name = "class_flag", catalog = "incbszdb")
public class ClassFlag implements java.io.Serializable {

    ....
    /* HERE */
    private Set classFlagI18ns = new HashSet(0);

    /* HERE */
    public void setClassFlagI18ns(Set classFlagI18ns) {
      this.classFlagI18ns = classFlagI18ns;
    }

}  

根据这篇文章

http://www.mkyong.com/hibernate/org-hibernate-annotationexception-collection-has-neither-generic-type-or-onetomany-targetentity/comment-page-1/#comment-67404

和这篇文章

http://www.mkyong.com/hibernate/hibernate-error-collection-has-neither-generic-type-or-onetomany-targetentity/

您必须亲自更改Hibernates生成的代码。

这是我想避免的一件事。任何想法可能是什么问题?

此致

JS

6 个答案:

答案 0 :(得分:13)

我找到了一个有效的解决方案。

只需检查“使用Java 5语法”,如附带的屏幕截图所示 Hibernate Tools为集合生成正确的泛型类型。

enter image description here

答案 1 :(得分:8)

例外告诉你的是明确的 - 你@OneToMany集合应指定具体类型(Set<AnotherEntity>)或@OneToMany(targetEntity=AnotherEntity.class)

答案 2 :(得分:2)

使用Java 5语法是正确的答案......但这是非常误导的。应该使用Java 5+语法..谁会想到使用java 5.

答案 3 :(得分:1)

搜索“Red Hat hbm2java docs”,因为链接已损坏。 添加奖金,因此您无需搜索。选中这两个复选框以“生成”生成的Java。不幸的是,复选框的标签并不表示如果检查它们会发生什么。有人会认为“使用Java 5语法”有很多含义,因为默认情况下它不是理想的/典型行为。

一定要检查两个框以使用注释和泛型。然后告诉Eclipse在“清理”选项下生成串行版本UID。花了3天的时间来解决这一切。

答案 4 :(得分:1)

对于那些需要的人。据我所知,在Java EE 5中,Java Enterprise Edition具有很多功能,特别是在使用注释和泛型时。所以这就是为什么我认为在Eclipse上检查“使用Java 5语法”,或者在Netbeans上的“Java 5兼容性”(不确定UI上的确切术语),在生成Hibernate实体时,将确保生成的代码将采取Java 5的那些“新功能”计数。

因为我的名声只有42,所以我无法发表评论!!!

答案 5 :(得分:0)

为了在自动构建中使用java 5泛型,您可以修改您的参数以启用jdk5,如下所示:

<hbm2java jdk5="true">

此信息记录在此处:Red Hat hbm2java docs