मेरी परियोजना में तीन मॉडल ऑब्जेक्ट के बीच एक संबंध है (पोस्ट के अंत में मॉडल और रिपॉजिटरी स्निपेट।
जब मैं कॉल PlaceRepository.findByIdकरता हूं तो यह तीन चुनिंदा प्रश्नों को फायर करता है:
( "एसक्यूएल")
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
बल्कि यह असामान्य व्यवहार है (मेरे लिए)। जहां तक मैं हाइबरनेट प्रलेखन को पढ़ने के बाद बता सकता हूं, इसमें हमेशा जॉइन प्रश्नों का उपयोग करना चाहिए। कक्षा में FetchType.LAZYपरिवर्तित होने पर प्रश्नों में कोई अंतर नहीं होता है (अतिरिक्त चयन के साथ क्वेरी), वर्ग के लिए समान जब (जोइन के साथ क्वेरी) में बदल जाता है ।FetchType.EAGERPlaceCityFetchType.LAZYFetchType.EAGER
जब मैं CityRepository.findByIdदो फायर को दबाने का उपयोग करता हूं :
SELECT * FROM city c where id = argSELECT * FROM state s where id = city.state.id
मेरा लक्ष्य सभी स्थितियों में एक समान व्यवहार रखना है (या तो हमेशा शामिल हों या चयन करें, जोइन को हालांकि पसंद किया जाता है)।
मॉडल परिभाषाएँ:
स्थान:
@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
}
Faridabad:
@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);
}