Ich habe eine Beziehung zwischen drei Modellobjekt in meinem Projekt (Modell und Repository-Schnipsel am Ende des Beitrags.Wie funktioniert die FetchMode Arbeit in Spring Data JPA
Wenn ich rufe PlaceRepository.findById
es tut Feuer drei Auswahlabfragen :
("SQL")
SELECT * FROM place p where id = arg
SELECT * FROM user u where u.id = place.user.id
SELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id
Das ist eher ungewöhnliches Verhalten (für mich). Soweit ich nach dem Lesen der Hibernate-Dokumentation feststellen kann, sollte es immer JOIN-Abfragen verwenden. Es gibt keinen Unterschied in den Abfragen, wenn FetchType.LAZY
zu FetchType.EAGER
in der Place
Klasse geändert wird (Abfrage mit zusätzlichen SELECT), das gleiche für die City
Klasse, wenn FetchType.LAZY
geändert zu FetchType.EAGER
(Abfrage mit JOIN).
Wenn ich CityRepository.findById
Unterdrückung von Bränden zwei wählt:
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
Mein Ziel ein, die sam Verhalten in allen Situationen zu haben ist (entweder immer JOIN oder SELECT, JOIN bevorzugt aber).
Modelldefinitionen:
Ort:
@Entity
@Table(name = "place")
public class Place extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user_author")
private User author;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_city_id")
private City city;
//getters and setters
}
Stadt:
@Entity
@Table(name = "area_city")
public class City extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_woj_id")
private State state;
//getters and setters
}
Repositorys:
PlaceRepository
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
UserRepository:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll();
User findById(int id);
}
CityRepository:
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}
Hava ein Blick auf 5 Möglichkeiten faul relationsships zu initialisieren: http://www.thoughts-on-java.org/5-ways-to-initialize-lazy-relations-and-when-to-use -them/ – GKislin