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.findById
nó sẽ kích hoạt ba truy vấn được chọn:
("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
Đó 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.LAZY
thay đổi thành FetchType.EAGER
trong Place
lớp (truy vấn có thêm SELECT), cũng giống như đối với City
lớp khi được FetchType.LAZY
thay đổ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 = arg
SELECT * 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);
}