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 = argSELECT * FROM user u where u.id = place.user.idSELECT * 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.LAZYdeğiştirildi FetchType.EAGERiçinde Placesınıf (ek SELECT ile sorguya), aynı Cityzaman sınıfa FetchType.LAZYdeğiştirildi FetchType.EAGER(JOIN ile sorguya).
CityRepository.findByIdBastırma yangınları kullandığımda iki seçim:
SELECT * FROM city c where id = argSELECT * 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);
}