У меня есть связь между тремя объектами модели в моем проекте (фрагменты модели и репозитория в конце сообщения.
Когда я звоню, PlaceRepository.findById
он запускает три запроса выбора:
("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
Это довольно необычное поведение (для меня). Насколько я могу судить после прочтения документации Hibernate, он всегда должен использовать запросы JOIN. Нет никакой разницы в запросах при FetchType.LAZY
изменении на FetchType.EAGER
в Place
классе (запрос с дополнительным SELECT), то же самое для City
класса при FetchType.LAZY
изменении на FetchType.EAGER
(запрос с JOIN).
Когда я использую CityRepository.findById
тушение пожаров, два выбора:
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
Моя цель - иметь поведение sam во всех ситуациях (либо всегда JOIN, либо SELECT, хотя предпочтительнее JOIN).
Определения модели:
Место:
@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
}
Город:
@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
}
Репозитории:
PlaceRepository
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
Репозиторий пользователей:
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);
}