"Незаконная попытка отобразить не коллекцию как @OneToMany, @ManyToMany или @CollectionOfElements"
Доброе утро, Stackoverflow,
У меня есть проблема, что это дает мне ошибку:
не удалось создать sessionFactory объект.орг.спячка.AnnotationException: незаконная попытка сопоставить не коллекция как @OneToMany, @ManyToMany или @CollectionOfElements: НЛ.scalda.пасимо.модель.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);
}
}
4 ответов
исключение простое и говорит:незаконная попытка отобразить не коллекцию как @OneToMany, @ManyToMany или @CollectionOfElements, поэтому причина здесь очевидна, и если мы посмотрим на спящий режим набор сопоставлений документация в нем ясно говорится, что:
в качестве требования постоянные поля со значением коллекции должны быть объявлены как тип интерфейса (см. Пример 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>
интерфейсы.
так что ваши посотреть не работает с TreeSet
, вы должны использовать Set<CoachGroup>
вместо TreeSet<CoachGroup>
:
private Set<CoachGroup> coachGroups = new HashSet<CoachGroup>();
вы должны сопоставлять интерфейсы, а не реализации. Это:
@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private TreeSet<CoachGroup> coachGroups = new TreeSet<>();
должен быть (также заменен TreeSet, потому что здесь достаточно хэш-набора):
@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private Set<CoachGroup> coachGroups = new HashSet<>();
вы не можете использовать конкретную реализацию в объявлении поля сущности. Вы можете использовать один из следующих:
- java.утиль.Список
- java.утиль.Set
- java.утиль.Коллекция
Так что в вашем случае это должно быть:
@OneToMany(cascade=CascadeType.ALL, targetEntity=CoachGroup.class)
@JoinColumn(name="id")
private Set<CoachGroup> coachGroups = new TreeSet<>();
вы не можете сохранить поля коллекции как конкретные классы.
впереди,
в качестве требования должны быть объявлены постоянные поля со значением коллекции в качестве типа интерфейса (см. Пример 7.2, " сопоставление коллекций с использованием @OneToMany и @JoinColumn"). Фактический интерфейс может быть Ява.утиль.Сет, java.утиль.Коллекции Ява.утиль.Список, java.утиль.Карта, Ява.утиль.SortedSet, java.утиль.SortedMap или все, что вам нравится ("все, что вам нравится" означает, что вы будете нужно написать реализацию орг.зимовать.файл usertype.UserCollectionType).
С Глава 7. Отображение Коллекции.
вы можете использовать ниже код для сохранения отсортированного набора (пожалуйста, прочитайте комментарии):
@OneToMany(cascade=CascadeType.ALL) //Removed targetEntity, as you are already using generics.
@JoinColumn(name="team_id") // Use this name as to show the presence of foreign key of EducationTeam in CoachGroup.
@SortNatural // Make sure that your CoachGroup Entity has implemented Comparable<CoachGroup> interface which wii be used while sorting.
private SortedSet<CoachGroup> coachGroups = new TreeSet<>();