ฉันมีความสัมพันธ์ระหว่างโมเดลอ็อบเจ็กต์สามตัวในโปรเจ็กต์ของฉัน (โมเดลและส่วนย่อยที่เก็บในตอนท้ายของโพสต์
เมื่อฉันเรียกPlaceRepository.findById
มันจะทำให้เกิดการค้นหาสามรายการ:
("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
นั่นเป็นพฤติกรรมที่ค่อนข้างผิดปกติ (สำหรับฉัน) เท่าที่ฉันสามารถบอกได้หลังจากอ่านเอกสาร Hibernate แล้วก็ควรใช้แบบสอบถาม JOIN เสมอ ไม่มีความแตกต่างในแบบสอบถามเมื่อFetchType.LAZY
เปลี่ยนเป็น FetchType.EAGER
ในPlace
คลาส (แบบสอบถามที่มี SELECT เพิ่มเติม) เช่นเดียวกับCity
คลาสเมื่อFetchType.LAZY
เปลี่ยนเป็น FetchType.EAGER
(แบบสอบถามที่มี JOIN)
เมื่อฉันใช้ CityRepository.findById
การระงับการยิงสองตัวเลือก:
SELECT * FROM city c where id = arg
SELECT * FROM state s where id = city.state.id
เป้าหมายของฉันคือการมีพฤติกรรมที่เหมือนกันในทุกสถานการณ์ (ไม่ว่าจะ JOIN หรือ SELECT เสมอก็ตามควรเข้าร่วม)
คำจำกัดความของโมเดล:
สถานที่:
@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
}
เมือง:
@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
}
ที่เก็บ:
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);
}