Saya memang memiliki hubungan antara tiga objek model dalam proyek saya (cuplikan model dan repositori di akhir posting.
Ketika saya menyebutnya, PlaceRepository.findById
itu mengaktifkan tiga kueri pemilihan:
("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
Itu perilaku yang agak tidak biasa (bagi saya). Sejauh yang saya tahu setelah membaca dokumentasi Hibernate, itu harus selalu menggunakan kueri JOIN. Tidak ada perbedaan dalam kueri saat FetchType.LAZY
diubah ke FetchType.EAGER
di Place
kelas (kueri dengan SELECT tambahan), sama untuk City
kelas saat FetchType.LAZY
diubah ke FetchType.EAGER
(kueri dengan JOIN).
Saat saya menggunakan CityRepository.findById
pemadaman api, dua pilihan:
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
Tujuan saya adalah untuk memiliki perilaku yang sama di semua situasi (baik selalu GABUNG atau PILIH, JOIN lebih disukai).
Definisi model:
Tempat:
@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
}
Kota:
@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
}
Repositori:
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);
}