У мене є зв'язок між трьома об'єктами моделі в моєму проекті (фрагменти моделі та репозиторію в кінці допису.
Коли я зателефоную, 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);
}
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);
}