我有兩個實體:電影和電影,他們有@ManyToMany關聯。電影是擁有方,在兩邊,我把收集到店FKS,並且兩側是懶惰牽強:hibernate lazy fetch,如何添加@ManytoMany關聯?
@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>();
...
}
因爲我使用的是懶惰取,如果我測試下面的代碼,我將獲得 「LazyInitializationException異常」:
//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的收藏集中,而無需獲取與m關聯的所有電影院?
或者我可能在理解hibernate中懶惰的集合時遇到了問題。我是hibernate和Spring的新手。任何幫助表示讚賞。 (如果你讀了我的問題,以這條線,謝謝無論< 3)