2016-05-15 56 views
0

我有兩個實體:電影和電影,他們有@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)

回答