জেপিএ আনার কৌশলটি ঠিক কী নিয়ন্ত্রণ করে? আমি আগ্রহী এবং অলস মধ্যে কোনও পার্থক্য সনাক্ত করতে পারি না। উভয় ক্ষেত্রেই জেপিএ / হাইবারনেট স্বয়ংক্রিয়ভাবে বহু-এক-এক সম্পর্কের সাথে যোগ দেয় না।
উদাহরণ: ব্যক্তির একক ঠিকানা রয়েছে। একটি ঠিকানা অনেক লোকের হতে পারে। জেপিএ টীকাযুক্ত সত্তা শ্রেণিগুলির মতো দেখতে:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
আমি যদি জেপিএ কোয়েরি ব্যবহার করি:
select p from Person p where ...
জেপিএ / হাইবারনেট ব্যক্তি টেবিল থেকে নির্বাচন করতে একটি এসকিউএল কোয়েরি তৈরি করে এবং তারপরে প্রতিটি ব্যক্তির জন্য একটি পৃথক ঠিকানা জিজ্ঞাসা :
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
বড় ফলাফলের সেটগুলির জন্য এটি খুব খারাপ। যদি 1000 জন থাকে তবে এটি 1001 ক্যোরিজ উত্পন্ন করে (ব্যক্তির 1 জন এবং ঠিকানা থেকে 1000 আলাদা)। আমি এটি জানি কারণ আমি মাইএসকিউএল এর ক্যোয়ারী লগটি দেখছি। এটি আমার বোঝা ছিল যে উত্সাহী ঠিকানার ঠিকানার প্রকারটি জেপিএ / হাইবারনেটকে একটি যোগদানের সাথে স্বয়ংক্রিয়ভাবে জিজ্ঞাসা করতে বাধ্য করবে। যাইহোক, আনয়নের ধরণ নির্বিশেষে এটি সম্পর্কের জন্য পৃথক অনুসন্ধান উত্পন্ন করে।
আমি যখন স্পষ্টভাবে এটিতে যোগদানের জন্য বলি তখনই এটি আসলে যোগদান করবে:
select p, a from Person p left join p.address a where ...
আমি কি এখানে কিছু মিস করছি? আমাকে এখন প্রতিটি প্রশ্নের সন্ধান করতে হবে যাতে এটি ছেড়ে যায় এমন একাধিক সম্পর্কের সাথে যোগ দেয়। আমি মাইএসকিউএল দিয়ে হাইবারনেটের জেপিএ প্রয়োগ ব্যবহার করছি।
সম্পাদনা: এটি প্রদর্শিত হয় (হাইবারনেট এফএকিউ এখানে এবং এখানে দেখুন ) যা FetchType
জেপিএ প্রশ্নের উপর প্রভাব ফেলে না। সুতরাং আমার ক্ষেত্রে আমি স্পষ্টভাবে এটিতে যোগদানের জন্য বলেছি।