আমার প্রকল্পে তিনটি মডেল অবজেক্টের (পোস্টের শেষে মডেল এবং সংগ্রহস্থলের স্নিপেটের) মধ্যে আমার একটি সম্পর্ক রয়েছে।
যখন আমি PlaceRepository.findById
এটি বলি তখন তিনটি নির্বাচিত প্রশ্নের উদ্রেক ঘটে:
("স্কয়ার")
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
এটি বরং অস্বাভাবিক আচরণ (আমার জন্য)। হাইবারনেট ডকুমেন্টেশন পড়ার পরে আমি যতদূর বলতে পারি এটি সর্বদা জিন কোয়েরি ব্যবহার করা উচিত। সেখানে প্রশ্নের যখন কোন পার্থক্য নেই FetchType.LAZY
পরিবর্তিত FetchType.EAGER
মধ্যে Place
বর্গ (অতিরিক্ত নির্বাচন সঙ্গে ক্যোয়ারী), একই City
ক্লাসে যখন FetchType.LAZY
পরিবর্তিত FetchType.EAGER
(JOIN সঙ্গে ক্যোয়ারী)।
আমি CityRepository.findById
দমনকারী আগুন ব্যবহার করার সময় দুটি নির্বাচন করে:
SELECT * FROM city c where id = arg
SELECT * 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);
}