"非法尝试将非集合映射为@OneToMany,@ ManyToMany或@CollectionOfElements"

mh1*_*ack 26 java collections hibernate exception hibernate-mapping

早上好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);
    }
}
Run Code Online (Sandbox Code Playgroud)

cнŝ*_*ŝdk 26

Exception很简单,并说:非法尝试将非集合映射为@OneToMany,@ ManyToMany或@CollectionOfElements,因此原因很明显,如果我们看一下Hibernate Collection映射文档,它会明确指出:

作为要求,必须将持久集合值字段声明为接口类型(请参见例7.2"使用@OneToMany和@JoinColumn进行集合映射").实际的界面可能是java.util.Set,java.util.Collection,java.util.List,java.util.Map,java.util.SortedSet,java.util.SortedMap...

并且您使用了TreeSet,它是两者和接口的实现.因此,您的实际映射将无法使用,您应该使用而不是:Set<E>SortedSet<E>TreeSetSet<CoachGroup>TreeSet<CoachGroup>

private Set<CoachGroup> coachGroups = new HashSet<CoachGroup>();
Run Code Online (Sandbox Code Playgroud)


Wil*_*son 6

发生此异常的另一个可能原因是使用非集合对象进行 @ManyToMany@OneToMany映射,或者使用集合对象进行@ManyToOne@OneToOne映射。下面的所有例子都是不正确的。

不正确

 @ManyToMany
 private User user;

 @ManyToOne
 private User user;

 @OneToOne
 private List<User> users;

 @ManyToOne
 private List<User> users;
Run Code Online (Sandbox Code Playgroud)