“非法尝试将非集合映射为@OneToMany、@ManyToMany 或@CollectionOfElements”

新手上路,请多包涵

早上好 Stackoverflow,

我有一个问题,它给了我错误:

无法创建 sessionFactory object.org.hibernate.AnnotationException:非法尝试将非集合映射为 @OneToMany、@ManyToMany 或 @CollectionOfElements:nl.scalda.pasimo.model.employeemanagement.EducationTeam.coachGroups

你知道为什么吗?

 @OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private TreeSet<CoachGroup> coachGroups = new TreeSet<>();
private SessionFactory factory;

private void initialiseFactory() {
    try {
        factory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        System.err.println("Failed to create sessionFactory object." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

原文由 mh123hack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 464
2 个回答

异常很简单,它说: 非法尝试将非集合映射为 @OneToMany、@ManyToMany 或 @CollectionOfElements ,所以这里的原因很明显,如果我们看一下 Hibernate Collection 映射 文档,它清楚地指出:

作为一项要求,持久性集合值字段必须声明为接口类型(请参阅示例 7.2,“使用@OneToMany 和@JoinColumn 的集合映射”)。 The actual interface might be java.util.Set , java.util.Collection , java.util.List , java.util.Map , java.util.SortedSet , java.util.SortedMap

您使用了 TreeSet ,它是 Set<E>SortedSet<E> 接口的实现 。因此,您的实际映射不适用于 TreeSet ,您应该使用 Set<CoachGroup> 而不是 TreeSet<CoachGroup>

 private Set<CoachGroup> coachGroups = new HashSet<CoachGroup>();

原文由 cнŝdk 发布,翻译遵循 CC BY-SA 4.0 许可协议

Another possible reasons for this exception to occur is using a non-collection object for @ManyToMany and @OneToMany mappings Or using collection object for @ManyToOne and @OneToOne 映射。以下所有示例都不正确。

不正确

 @ManyToMany
 private User user;

 @ManyToOne
 private User user;

 @OneToOne
 private List<User> users;

 @ManyToOne
 private List<User> users;

原文由 Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题