Ошибки в попытке получить список для поля ManyToMany. JPA+Hibernate
У меня есть два класса -- фильм и автор. Между ними есть двусторонная связь ManyToMany. Фильм содержит в себе список авторов. Я пытаюсь реализовать все это через EntityManager. Цель - получить список авторов для конкретного фильма.
Class movie:
@Entity
@Table(name = "MOVIE")
@Data
public class Movie {
@Id
private Long id;
private String movieName;
@ManyToMany
@JoinTable(
name = "movie_authors",
joinColumns = @JoinColumn(name = "movie_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set<Author> authors = new HashSet<>();
public void addAuthor(Author author) {
authors.add(author);
}
}
Class author:
@Entity
@Data
public class Author {
@Id
private String name;
@ManyToMany(mappedBy = "authors")
private Set<Movie> movies = new HashSet<>();
}
Метод, где я создаю фильмы и авторов, потом добавляю в базу данных.
public void saveMovie() {
EntityManager em = getEntityManager();
em.getTransaction().begin();
Movie movie = new Movie();
movie.setId(1L);
movie.setMovieName("The Godfather");
Author author = new Author();
author.setName("Privet");
movie.addAuthor(author);
Author author1 = new Author();
author1.setName("Lol");
movie.addAuthor(author1);
em.persist(author);
em.persist(author1);
em.persist(movie);
em.getTransaction().commit();
}
Затем я пытаюсь получить фильм вместе со списком авторов.
public Movie getMovie(Long movieId) {
EntityManager em = getEntityManager();
Movie movie = em.find(Movie.class, movieId);
Hibernate.initialize(movie.getAuthors());
em.detach(movie);
return movie;
}
Но я всегда получаю такую ошибку. Если же я убираю строку с Hibernate.initialize(), то уже идет LazyException.
Exception in thread "main" java.lang.StackOverflowError
at org.h2.command.Parser.readTerm(Parser.java:4303)
at org.h2.command.Parser.readFactor(Parser.java:3343)
at Movie.hashCode(Movie.java:9)
at java.base/java.util.HashMap.hash(HashMap.java:339)
at java.base/java.util.HashMap.put(HashMap.java:607)
at java.base/java.util.HashSet.add(HashSet.java:220)
at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:352)
at org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:355)
at Author.hashCode(Author.java:10)
at java.base/java.util.HashMap.hash(HashMap.java:339)
at java.base/java.util.HashMap.put(HashMap.java:607)
at java.base/java.util.HashSet.add(HashSet.java:220)
at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:352)
Что я не так делаю?
Ответы (1 шт):
Автор решения: WolfAlm
→ Ссылка
Вся проблема была в использовании Lombok, а именно в аннотации @Data, так как она создавала рекурсивную связь со списком(toString, HashCode, equals)