আমার প্রকল্পে তিনটি মডেল অবজেক্টের (পোস্টের শেষে মডেল এবং সংগ্রহস্থলের স্নিপেটের) মধ্যে আমার একটি সম্পর্ক রয়েছে।
যখন আমি 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.EAGERমধ্যে Placeবর্গ (অতিরিক্ত নির্বাচন সঙ্গে ক্যোয়ারী), একই Cityক্লাসে যখন FetchType.LAZYপরিবর্তিত FetchType.EAGER(JOIN সঙ্গে ক্যোয়ারী)।
আমি 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
}
নগরী:
@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
}
ভান্ডারগুলি:
প্লেস রেপোসিটরি
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
ইউজাররেপোসিটোরি:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll();
User findById(int id);
}
নগরী
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}