org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany

607
10 сентября 2017, 00:29

Пытаюсь соединиться с бд используя hibernate. Есть 6 таблиц(2 из них для связи ManyToMany) и 4 POJO класса с JPA-мапингом.
Падает с такой ошибкой:

org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: model.pojo.City.hotels

Вот POJO класс в котором ошибка:

@Entity
@Table(name="CITY")
public class City implements Comparable<City>, Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequnce_id_generator_city")
@SequenceGenerator(name = "sequnce_id_generator_city", sequenceName = "SEQ_FOR_CITY_ID")
@Column (name="ID")
private int id;
@Column (name="NAME")
private String name;
@OneToMany(targetEntity=Hotel.class, mappedBy="city")
private HashSet<Hotel> hotels = new HashSet();
@ManyToOne
@JoinColumn(name="COUNTRY", nullable=false)
private Country country;

Вот pojo на который ссылается:

@Entity
@Table(name = "HOTEL")
public class Hotel implements Comparable<Hotel>, Serializable {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String name;
@Column(name = "STARS")
private int stars;
@Column(name = "DESCRIPTION")
private String description;
@ManyToOne
@JoinColumn(name = "COUNTRY", nullable=true)
private Country country;
@ManyToOne
@JoinColumn(name = "CITY", nullable=true)
private City city;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="HOTEL_TOUR_OPERATOR",
joinColumns = @JoinColumn(name="HOTEL_ID"),
inverseJoinColumns = @JoinColumn(name="TOUR_OPERATOR_ID"))
private Set<Operator> operator = new HashSet();

Ошибка говорит о том что model.pojo.City.hotels должен быть коллекцией. Или я чего то не понял?

Answer 1

Объявите поле с абстрактным типом:

private Set<Hotel> hotels = ...

Из документации Hibernate

2.8. Collections
...
Hibernate uses its own collection implementations which are enriched with lazy-loading, caching or state change detection semantics. For this reason, persistent collections must be declared as an interface type. The actual interface might be java.util.Collection, java.util.List, java.util.Set, java.util.Map, java.util.SortedSet, java.util.SortedMap or even other object types (meaning you will have to write an implementation of org.hibernate.usertype.UserCollectionType).

Вольный перевод:
2.8. Коллекции
...
Hibernate использует собственные реализации коллекций, в которые добавлены ленивая загрузка, кэширование и семантика изменения состояний. По этой причине сохраняемые коллекции должны быть объявлены с типом-интерфейсом. Могут быть использованы java.util.Collection, java.util.List, java.util.Set, java.util.Map, java.util.SortedSet, java.util.SortedMap. Другие типы тоже можно использовать, но в этом случае вам придется реализовать org.hibernate.usertype.UserCollectionType.

Иными словами Hibernate подставит в hotels свою реализацию Set. Писать служебные коллекции под всевозможные реализации множества (HashSet, TreeSet, и т.д и т.п.) в данном случае неоптимально.

READ ALSO
Не могу понять как найти совпадающие значения в словаре HashMap

Не могу понять как найти совпадающие значения в словаре HashMap

ЗдравствуйтеУ меня есть HashMap, в котором находится 10 пар "ключ-значение"

370
Конвертация double в int

Конвертация double в int

Доброго времени сутокЕсть код, который проводит некоторые операции с числами типа double а потом выводит их на экран

426
Ошибка cannot be resolved to a variable

Ошибка cannot be resolved to a variable

Всем привет! Собираю кастомную прошивку, портирую функции в неё, у меня есть вопрос по данному коду:

326
Обтекание текста вокруг View элемента в ConstraintLayout

Обтекание текста вокруг View элемента в ConstraintLayout

Есть ли реализация обтекания текста в разметке xml в контейнере Constraint, без программной реализации, если только программное, не подскажите...

393