Pobieranie obiektów z relacji Many to Many

0

Witam, mam pytanie odnośnie Spring Data Jpa.

  1. Czy jeśli mam relację User - Movie many to many i chcę wyciągnąć user.getMovies() to muszę to zrobić w taki sposób w UserRepository:
@Transactional(readOnly = true)
	@Query("select m from Movie m INNER JOIN m.users u where u.id = ?1")
	public List<Movie> getUserMovies(long idUser);

?
Czemu nie da się w serwisie stworzyć metody:

@Transactional(readOnly = true)
	public List<Movie> getUserMovies(User user) {
		return user.getMovies();
	}

Czy może jest jakiś inny mądrzejszy sposób?
2. Czy w kontrolerach powinno się używać repozytoriów czy tylko serwisów? Jeśli tylko serwisów to powinny posiadać dodatkowe metody i nadpisywać metody z repozytoriów?

1

ad1. Do tak prostych rzeczy, poczytaj o many-to-many w hibernate. Wystarczy, że w klasie User zrobisz sobie coś typu:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_has_movie",
       joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
       inverseJoinColumns={@JoinColumn(name="movie_id", referencedColumnName="id")})
public Set<Movie> getMovies() {
   return movies;
}

i w transakcji będziesz mógł sobie robić po prostu user.getMovies();

0

https://github.com/cinek1992/springdatajpa2
Mam to zrobione i dostaję LazyInitializationException

0

Bo pewnie masz FetchType.Lazy, ustaw FetchType.EAGER

0

Jeżeli będę miał EAGER i w repozytorium mam metodę wyciągającą List<User> to od razu zaciągnie mi też wszystkie List<Movie> dla każdego usera?

1 użytkowników online, w tym zalogowanych: 0, gości: 1