মার্জ() পদ্ধতির সূক্ষ্মতা

আপনি যদি ইতিমধ্যে ডাটাবেসে সংরক্ষিত একটি বস্তু পরিবর্তন করতে হাইবারনেট ব্যবহার করতে চান তবে এর জন্য বেশ কয়েকটি পদ্ধতি রয়েছে।

প্রথমটি হল মার্জ() পদ্ধতি , যা পাস করা বস্তুর উপর ভিত্তি করে ডাটাবেসের তথ্য আপডেট করে । এটি এসকিউএল আপডেট কোয়েরি শুরু করবে। উদাহরণ:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

এখানে বেশ কয়েকটি গুরুত্বপূর্ণ সূক্ষ্মতা রয়েছে।

প্রথমত, মার্জ() পদ্ধতি ফলাফল, আপডেট করা অবজেক্ট প্রদান করে। এই বস্তুর একটি স্থায়ী অবস্থা আছে এবং সেশন অবজেক্টের সাথে সংযুক্ত। মার্জ() পদ্ধতিতে পাস করা বস্তুটি পরিবর্তন হয় না।

এটা মনে হতে পারে যে ব্যবহারকারী এবং user2 এর মধ্যে কোন পার্থক্য নেই, কিন্তু তা নয়। আপনি মার্জ() পদ্ধতিতে একটি POJO অবজেক্ট পাস করতে পারেন এবং ফলস্বরূপ, পদ্ধতিটি একটি প্রক্সি ফেরত দিতে পারে (হাইবারনেট সেটিংসের উপর নির্ভর করে)। তাই শুধু মনে রাখবেন যে merge() পদ্ধতি পাস করা বস্তু পরিবর্তন করে না।

দ্বিতীয়ত, merge() এ পাস করা বস্তুটির যদি ক্ষণস্থায়ী অবস্থা থাকে (এবং এটির একটি আইডি নেই), তাহলে ডাটাবেসে এটির জন্য একটি পৃথক লাইন তৈরি করা হবে। অন্য কথায়, persist() কমান্ডটি কার্যকর করা হবে ।

তৃতীয়ত, যদি সেশনের সাথে আগে থেকেই সংযুক্ত একটি বস্তু (Psist Status সহ) merge() পদ্ধতিতে পাস করা হয়, তাহলে কিছুই হবে না - পদ্ধতিটি কেবল একই বস্তু ফিরিয়ে দেবে। কেন? এবং সব কারণ যখন লেনদেন প্রতিশ্রুতিবদ্ধ হয়, ডেটা যেভাবেই হোক ডাটাবেসে লেখা হবে:

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

বস্তুটির যে কোনো পরিবর্তনের পরে প্রতিবার সংরক্ষণ করার প্রয়োজন নেই। যদি এই বস্তুটি স্থায়ী অবস্থায় থাকে, তাহলে হাইবারনেট নিজেই সবকিছু করবে। আপনি যদি "বেসের সাথে সংযুক্ত" একটি বস্তু পরিবর্তন করেন, তবে এর সমস্ত পরিবর্তন বেসে লেখা হবে।

আপডেট() পদ্ধতির সূক্ষ্মতা

হাইবারনেটের একটি আপডেট() পদ্ধতিও রয়েছে , যা save() পদ্ধতির মতো , পূর্ববর্তী সংস্করণগুলি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয়েছিল। এই পদ্ধতির সাহায্যে, আপনি শুধুমাত্র ইতিমধ্যে সংরক্ষিত বস্তুর ডেটা আপডেট করতে পারেন। এটি এসকিউএল আপডেট কোয়েরি শুরু করবে। উদাহরণ:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

এই পদ্ধতিটি কিছু ফেরত দেয় না এবং বিদ্যমান বস্তু পরিবর্তন করে না।

আপনি যদি এই পদ্ধতিটিকে একটি নতুন বস্তুতে কল করেন, তবে একটি ব্যতিক্রম কেবল নিক্ষেপ করা হবে:

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

saveOrUpdate() পদ্ধতি

JPA এর আবির্ভাবের আগে, persist() পদ্ধতির ফাংশন saveOrUpdate() পদ্ধতি দ্বারা সম্পাদিত হয়েছিল । তার কাজ ছিল ডাটাবেসে বিদ্যমান বস্তুর তথ্য আপডেট করা, এবং যদি কোনটি না থাকে তবে এটি তৈরি করা। এটি প্রায় সবসময় save() এবং update() পদ্ধতির জায়গায় ব্যবহৃত হয় ।

Update() পদ্ধতির বিপরীতে , এটি এতে পাস করা বস্তু পরিবর্তন করতে পারে। উদাহরণস্বরূপ, এটিকে আইডিতে সেট করুন যা ডেটাবেসে সংরক্ষণ করার সময় বরাদ্দ করা হয়েছিল। উদাহরণ:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

কিভাবে এটা কাজ করে:

  • পাস করা বস্তুর একটি আইডি থাকলে, আপডেট এসকিউএল পদ্ধতি বলা হয়
  • যদি পাস করা বস্তুর আইডি সেট করা না থাকে, তাহলে INSERT SQL পদ্ধতি বলা হয়