【问题标题】:org.hibernate.AnnotationException: Collection has neither generic type or OneToMany.targetEntity()org.hibernate.AnnotationException:集合既没有泛型类型也没有 OneToMany.targetEntity()
【发布时间】:2011-10-19 18:15:42
【问题描述】:

我使用 Hibernate 工具 来生成我的 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

【问题讨论】:

    标签: java hibernate annotations hibernate-tools


    【解决方案1】:

    我找到了适合我的解决方案。

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

    【讨论】:

    • “使用Java 5语法”的目的是什么?不使用有什么坏处?
    • @Dash “使用 Java 5 语法”的目的是在我所见的范围内将泛型添加到您的集合中......
    【解决方案2】:

    异常告诉您的内容很清楚 - 您的 @OneToMany 集合应指定具体类型 (Set<AnotherEntity>) 或具有 @OneToMany(targetEntity=AnotherEntity.class)

    【讨论】:

    • 是的,但这将是我在通过 Hibernate 工具生成代码后必须“手动”更改的内容,这是我想要避免的,否则每次我更改数据库并生成 POJO 时通过 Hibernate 工具,我必须自己进行更改 ....
    • 这就是为什么你不应该重新生成它。反过来做 - 使用您的对象模型作为数据库更改的基础
    • 因为否则每次我在关系模型 (DB) 中更改某些内容时,我都必须手动进行所有更改,这很容易出错......
    • 感谢您的帮助,我找到了解决方案。无论如何,由于你的努力,我会投票给你。问候 JS
    【解决方案3】:

    对于那些需要的人。据我所知,在 Java EE 5 中,Java 企业版获得了很多功能,尤其是在使用注解和泛型方面。所以这就是为什么我认为在使用 Hibernate 生成实体时,在 Eclipse 上检查“使用 Java 5 语法”或在 Netbeans 上检查“Java 5 兼容性”(不确定 UI 上的确切术语),将确保生成的代码将Java 5 的“新功能”数不胜数。

    因为我的声望只有 42 我无法评论!!!

    【讨论】:

      【解决方案4】:

      使用 Java 5 语法是正确的答案...但它非常具有误导性。应该是 Use Java 5+ Syntax.. 谁会想用 java 5。

      【讨论】:

        【解决方案5】:

        搜索“Red Hat hbm2java docs”,因为链接已损坏。 额外的奖励,所以你不必搜索。选中这两个复选框以“现代化”生成的 Java。不幸的是,复选框的标签并不能说明如果您选中它们会发生什么。有人会认为“使用 Java 5 语法”有很多含义,并且由于默认情况下它是关闭的,因此它不是所需/典型的行为。

        请务必选中这两个框以使用注释和泛型。然后告诉 Eclipse 在“清理”选项下生成串行版本 UID。我花了 3 天时间才弄清楚这一切。

        【讨论】:

          【解决方案6】:

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

          <hbm2java jdk5="true">
          

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

          【讨论】:

            猜你喜欢
            • 2017-10-28
            • 1970-01-01
            • 2016-06-11
            • 1970-01-01
            • 2012-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多