2.1 আনার বিকল্প
হাইবারনেটের বিকাশকারীরা দীর্ঘদিন ধরে শিশু সত্তা লোড করার সমস্যা সম্পর্কে জানেন। তাই তারা প্রথম যে কাজটি করেছিল তা হল টীকাগুলিতে একটি বিশেষ আনয়ন পরামিতি যোগ@OneToMany
করা ।@ManyToMany
এই প্যারামিটার দুটি মান নিতে পারে:
- আগ্রহী
- অলস
উদাহরণ:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
যদি আনয়ন পরামিতি EAGER এর সমান হয় , তাহলে যখন মূল সত্তা লোড হয়, তখন এর সমস্ত চাইল্ড সত্তাও লোড হবে৷ এছাড়াও, হাইবারনেট একটি এসকিউএল ক্যোয়ারীতে এটি করার চেষ্টা করবে, একটি ভারী ক্যোয়ারী তৈরি করবে এবং একবারে সমস্ত ডেটা আনবে।
যদি ফেচ প্যারামিটারটি LAZY মান নেয় , তাহলে যখন মূল সত্তা লোড হয়, তখন চাইল্ড এন্টিটি লোড হবে না। পরিবর্তে, একটি প্রক্সি অবজেক্ট তৈরি করা হবে।
এই প্রক্সি অবজেক্টের সাহায্যে, হাইবারনেট এই শিশু সত্তার অ্যাক্সেস ট্র্যাক করবে এবং প্রথমবার অ্যাক্সেস করার সময় এটি মেমরিতে লোড করবে।
যদি আমরা মন্তব্য সহ আমাদের পরিস্থিতি মনে করি:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
তারপরে আপনার একটি "চটকদার পছন্দ" আছে:
যদি fetch = FetchType.EAGER
, তারপর হাইবারনেট কোডের ১ম লাইনে সমস্ত মন্তব্য লোড করবে:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
যদি fetch = FetchType.LAZY
, তারপর হাইবারনেট কোডের 2য় লাইনের সমস্ত মন্তব্য লোড করবে:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
আপনি ইতিমধ্যে অনুমান করতে পারেন, আপনার কাছে কোন বিকল্প নেই যখন এটি সমস্ত মন্তব্য লোড করে না :)
2.2 ডিফল্ট মান
আপনি যদি ... টীকাটির জন্য একটি আনয়ন বিকল্প নির্দিষ্ট না করেন @ManyTo
, তাহলে হাইবারনেট ডিফল্ট মান ব্যবহার করবে।
বিভিন্ন টীকা ধরনের জন্য তারা সামান্য ভিন্ন. টীকাগুলির জন্য @OneToOne
এবং @ManyToOne
আগ্রহী, টীকাগুলির জন্য @OneToMany
এবং @ManyToMany
অলস৷ এটা মনে রাখা সহজ - যদি আমরা একটি বস্তু উল্লেখ করি, তাহলে এটি সম্পূর্ণরূপে লোড হবে। যদি আমরা একটি সংগ্রহ উল্লেখ করি, তাহলে এটি প্রথমবার অ্যাক্সেস করার সময় লোড হবে।
2.3 @LazyCollection টীকা
আপনি ইতিমধ্যে দেখেছেন, সংগ্রহের সাথে কাজ করার সময় ফেচ প্যারামিটার খুব বেশি সাহায্য করে না। হাইবারনেটের নির্মাতারা একটি বিশেষ টীকা যোগ করে এটি ঠিক করার চেষ্টা করেছেন @LazyCollection
। এটি সাধারণত এভাবে লেখা হয়:
@LazyCollection(LazyCollectionOption.TRUE)
সংগ্রহের ক্ষেত্র ম্যাপ করার সময় আপনাকে এটি নির্দিষ্ট করতে হবে:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
এই টীকাটির একটি মান পরামিতি রয়েছে যা তিনটি মানের মধ্যে একটি নিতে পারে:
- LazyCollectionOption. সত্য
- LazyCollectionOption. মিথ্যা
- LazyCollectionOption. অতিরিক্ত
প্রথম দুটি বিকল্প ফেচ বিকল্পের সাথে খুব মিল।
যদি প্যারামিটারটি সেট করা থাকে LazyCollectionOption.TRUE
, তাহলে এর মানে হল যে যখন প্যারেন্ট ইউজার অবজেক্ট লোড করা হয় তখন মন্তব্য ক্ষেত্রের মানগুলি ডাটাবেস থেকে লোড হবে না । কমেন্ট টাইপ অবজেক্ট লোড করা হবে যখন প্রথমবার কমেন্ট ফিল্ড অ্যাক্সেস করা হবে। আসলে, এটি প্যারামিটারের সমতুল্যFetchType.LAZY
যদি প্যারামিটারটি সেট করা থাকে LazyCollectionOption.FALSE
, তাহলে এর মানে হল যে মন্তব্য ক্ষেত্রের মানগুলি প্যারেন্ট ইউজার অবজেক্ট লোড করার সময় ডাটাবেস থেকে লোড করা হবে । কমেন্ট টাইপ অবজেক্ট লোড করা হবে যখন প্রথমবার কমেন্ট ফিল্ড অ্যাক্সেস করা হবে। আসলে, এই সমতুল্য FetchType.EAGER
.
GO TO FULL VERSION