hibernate lazy fetch,如何添加@ManytoMany关联?

时间:2016-05-15 03:04:54

标签: spring hibernate collections many-to-many fetch

我有两个实体:电影和电影,他们有@ManyToMany关联。电影是自己的一方,在两边,我都有一个收藏来存储fks,而且这两方都是偷懒的:

@Table(name="Cinema")
@Entity
public class Cinema {
@ManyToMany(cascade = CascadeType.ALL,
            fetch=FetchType.LAZY)
@JoinTable(name = "cinema_movie",
            joinColumns = {@JoinColumn(name = "cinema_id", nullable = false, updatable = false)},
            inverseJoinColumns = {@JoinColumn(name = "movie_id", nullable = false, updatable = false)})
private @Getter @Setter Set<Movie> movies = new HashSet<Movie>();
...
}

@Entity
@Table(name="Movie")
public class Movie {
@ManyToMany(cascade = CascadeType.ALL,
            mappedBy = "movies")
private @Getter @Setter Set<Cinema> cinemas = new HashSet<Cinema>();
...
}

因为我使用了lazy-fetch,如果我测试下面的代码,我会得到一个 &#34; LazyInitializationException中&#34;:

//mp and cp means MovieRepo and CinemaRepo
Cinema c2 = new Cinema();
        c2.setCity(1);
        c2.setAddress("chigang");
        c2.setName("feiyang");
    cp.save(c2);
    m = mp.findByName("Zootopia");
    //m = mp.fetchCinemas(m.getId());
    m.addCinema(c2);
    c2.addMovie(m);
    cp.save(c);

如果我取消注释//m = mp.fetchCinemas(m.getId());,则异常消失。正如您所预测的,我在此方法中执行以下sql查询:

@Query(
        "SELECT c FROM Cinema c INNER JOIN FETCH c.movies "+ 
        "WHERE c.id = :cid"
      )
Cinema fetchMovies(@Param("cid") Long cid);

但是,当我只想将电影与电影相关联时,明确获取所有电影院,然后添加一个电影,然后将它们全部保存起来很麻烦。

如何在不获取与m? 相关的所有影院的情况下,将minema添加到m系列中

或许我在hibernate中理解延迟获取的集合时遇到问题。我是hibernate和Spring的新手。任何帮助表示赞赏。 (如果你把我的问题读到这一行,谢谢你,无论如何<3)

1 个答案:

答案 0 :(得分:0)

如果您不想在添加新元素之前获取所有收藏品,则可以使用 Bag 收藏而不是设置

请参阅下面的帖子,其中解释了实现它的各种方法:

Hibernate - How to persist a new item in a Collection without loading the entire Collection