Pobieranie obiektów z relacji Many to Many

Pobieranie obiektów z relacji Many to Many
C1
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 lat
  • Postów:72
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:
Kopiuj
@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:

Kopiuj
@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?

KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
1

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

Kopiuj
@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();


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
C1
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 lat
  • Postów:72
0

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

KA
nie jesteś w transakcji
SK
  • Rejestracja:około 12 lat
  • Ostatnio:około miesiąc
  • Postów:133
0

Bo pewnie masz FetchType.Lazy, ustaw FetchType.EAGER

edytowany 1x, ostatnio: skytrack
Allocer44
raczej na pewno, domyślnie FetchType jest lazy.
C1
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 lat
  • Postów:72
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?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.