【问题标题】:Getting errors in getting collection for ManyToMany JPA+Hibernate获取 ManyToMany JPA+Hibernate 的集合时出错
【发布时间】:2021-06-13 18:11:34
【问题描述】:

我有两节课。一部让作者参与其中的电影。还有作者本人。我想使用 EntityManager 为他们建立多对多连接,然后我可以在其中获取 Set 的数据。

类电影:

@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);
  }
}

班级作者:

@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;
  }

但我得到了更多的例外:

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)

怎么了?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我认为 Lombok 生成的 hashCode 方法会导致无限循环,因为 Movie 引用了 Authors,每个 Authors 都引用同一个 Movie 实例。

    您可能可以通过检查字节码来确认这一点,或者只是放弃@Data 注释并在实体上手动编码equalshashCode

    或者,您应该能够在 Author - https://projectlombok.org/features/EqualsAndHashCode 的电影属性上使用 @EqualsAndHashCode.Exclude 注释来打破循环

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2011-04-28
      • 2020-02-04
      • 1970-01-01
      • 2015-08-06
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多