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)
发生此异常的另一个可能原因是使用非集合对象进行
@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)