Tôi thực sự có mối quan hệ giữa ba đối tượng mô hình trong dự án của mình (mô hình và đoạn mã kho lưu trữ ở cuối bài đăng.
Khi tôi gọi, PlaceRepository.findByIdnó sẽ kích hoạt ba truy vấn được chọn:
("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
Đó là hành vi khá bất thường (đối với tôi). Theo như tôi có thể nói sau khi đọc tài liệu Hibernate, nó sẽ luôn sử dụng các truy vấn JOIN. Không có sự khác biệt nào trong các truy vấn khi được FetchType.LAZYthay đổi thành FetchType.EAGERtrong Placelớp (truy vấn có thêm SELECT), cũng giống như đối với Citylớp khi được FetchType.LAZYthay đổi thành FetchType.EAGER(truy vấn với JOIN).
Khi tôi sử dụng CityRepository.findByIdđám cháy dập tắt, hai lựa chọn:
SELECT * FROM city c where id = argSELECT * FROM state s where id = city.state.id
Mục tiêu của tôi là có một hành vi sam trong tất cả các tình huống (luôn luôn THAM GIA hoặc CHỌN, mặc dù ưu tiên THAM GIA).
Định nghĩa mô hình:
Địa điểm:
@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
}
Thành phố:
@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
}
Kho lưu trữ:
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);
}