Projemdeki üç model nesne arasında bir ilişkim var (yazının sonunda model ve depo snippet'leri.
Onu aradığımda PlaceRepository.findById
üç seçme sorgusu ateşliyor:
("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
Bu oldukça sıra dışı bir davranış (benim için). Hazırda bekletme belgelerini okuduktan sonra anlayabildiğim kadarıyla her zaman JOIN sorgularını kullanmalıdır. Sorgularda fark yoktur FetchType.LAZY
değiştirildi FetchType.EAGER
içinde Place
sınıf (ek SELECT ile sorguya), aynı City
zaman sınıfa FetchType.LAZY
değiştirildi FetchType.EAGER
(JOIN ile sorguya).
CityRepository.findById
Bastırma yangınları kullandığımda iki seçim:
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
Amacım her durumda aynı davranışa sahip olmaktır (her zaman KATIL veya SEÇ, yine de KATIL tercih edilir).
Model tanımları:
Yer:
@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
}
Kent:
@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
}
Depolar:
Yer Deposu
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);
}
Şehir Havuzu:
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}