সম্ভাব্য অবজেক্ট স্ট্যাটাস অপশন
আপনি হয়তো লক্ষ্য করেছেন, যখন কোনো বস্তু হাইবারনেটের সাথে সংযুক্ত থাকে, তখন তার অবস্থাকে বলা হয় Persistent বা Managed । কতটা ঠিক? অব্যাহত বা পরিচালিত?
এটা সম্ভব এবং তাই, এবং তাই. JPA স্পেসিফিকেশন অনুসারে, একটি বস্তুর একটি স্থায়ী অবস্থা থাকে এবং হাইবারনেট স্পেসিফিকেশন অনুসারে, এর অবস্থাকে বলা হয় পরিচালিত।
হাইবারনেটে, ডাটাবেসের সাথে কাজ করা হয় org.hibernate.Session ধরনের একটি বস্তুর মাধ্যমে । JPA অনুযায়ী, ক্লাসটিকে javax.persistence.EntityManager বলা উচিত। এটি সত্যিই একটি বড় সমস্যা নয়, যেহেতু উভয় প্রকার ইন্টারফেস।
org.hibernate.Session ইন্টারফেস এভাবে ঘোষণা করা হয়েছে:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
অতএব, সেশন ইন্টারফেসে সমস্ত পদ্ধতি রয়েছে যা EntityManager ইন্টারফেসে রয়েছে । তবে এটির নিজস্বও রয়েছে, যা এটি হাইবারনেটের পূর্ববর্তী সংস্করণগুলি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, যখন এখনও কোন JPA স্পেসিফিকেশন ছিল না।
এই পুরো পরিস্থিতিটি নিম্নরূপ বর্ণনা করা হয়েছে:
![](https://cdn.codegym.cc/images/article/c4cc3931-5115-471e-aec1-812c863f7c4a/1024.jpeg)
আসুন সেশন ইন্টারফেসের সমস্ত পদ্ধতির পাশাপাশি তাদের কাজের সূক্ষ্মতাগুলি দেখে নেওয়া যাক।
persist() পদ্ধতির সূক্ষ্মতা
ডাটাবেসে একটি বস্তু সংরক্ষণ করার সময়, আপনাকে দুটি জিনিস মনে রাখতে হবে।
প্রথমত, অবজেক্টটি সংরক্ষণ করার ফলে শেষ পর্যন্ত এসকিউএল কমান্ডগুলির একটি কার্যকর হবে: INSERT বা UPDATE। দ্বিতীয়ত, অবজেক্টের পদ্ধতিতে কল করার সাথে সাথে এই ক্রিয়াগুলি ঘটবে নাসেশন, কিন্তু শুধুমাত্র লেনদেন বন্ধ করার পরে।
আসুন কিছু সাধারণ পরিস্থিতি বিবেচনা করা যাক, উদাহরণস্বরূপ, আপনার একটি ব্যবহারকারী শ্রেণী রয়েছে :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
persist() পদ্ধতি ব্যবহার করে এর অবজেক্টটিকে ডাটাবেসে সংরক্ষণ করা যাক ।
User user = new User();
user.setName("Kolyan");
session.persist(user);
এই পদ্ধতির উদ্দেশ্য হল ডাটাবেসে একটি নতুন বস্তু সংরক্ষণ করা। যদি এখনও এমন কোন বস্তু না থাকে, তাহলে INSERT SQL পদ্ধতিতে কল করে এটি ডাটাবেসে যোগ করা হবে ।
যদি বস্তুটি ইতিমধ্যে ডাটাবেসে থাকে তবে কিছুই হবে না। যাইহোক, একটি তৃতীয় ক্ষেত্রেও সম্ভব - ডাটাবেসে বিচ্ছিন্ন অবস্থা সহ একটি বস্তু সংরক্ষণ করার প্রচেষ্টা। এই ক্ষেত্রে, একটি ব্যতিক্রম নিক্ষেপ করা হবে. উদাহরণ:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
save() পদ্ধতির সূক্ষ্মতা
save() পদ্ধতিটি বর্তমান হাইবারনেট এর পূর্ববর্তী সংস্করণ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয়েছে। এর মূল অংশে, এটি persist() পদ্ধতির অনুরূপ , এটি INSERT পদ্ধতি ব্যবহার করে টেবিলে একটি নতুন রেকর্ড যোগ করে। যাইহোক, এর বেশ কয়েকটি আকর্ষণীয় সূক্ষ্মতা রয়েছে।
প্রথমত, এই পদ্ধতিটি একটি মান প্রদান করে - বস্তুর নতুন আইডি । আপনি ইতিমধ্যেই জানেন, ডাটাবেসে যুক্ত হওয়ার আগে অবজেক্টের সাধারণত একটি আইডি থাকে না এবং এটি ইতিমধ্যেই ডাটাবেস দ্বারা বরাদ্দ করা হয়। সুতরাং, সেশন অবজেক্টের save() পদ্ধতিটি সেভ করা অবজেক্টের জন্য নির্ধারিত আইডি ফেরত দেয়।
গুরুত্বপূর্ণ ! হাইবারনেট আইডি স্পেসিফিকেশন অনুযায়ী, এটি যেকোনও ক্রমিক বস্তু হতে পারে, শুধু একটি সংখ্যা নয়। এটি একটি স্ট্রিং, একটি সংখ্যা, একটি এনাম, সাধারণভাবে এমন কিছু হতে পারে যা ডাটাবেসের একটি টেবিলের একটি কলামে সম্পূর্ণরূপে রাখা যেতে পারে।
save() পদ্ধতিতে একটি ক্রমিক ফলাফলের ধরন রয়েছে, তাই এর ফলাফল অবশ্যই সঠিক টাইপে নিক্ষেপ করা উচিত:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
এছাড়াও, অবজেক্টের বিচ্ছিন্ন অবস্থার ক্ষেত্রে save() পদ্ধতির একটি ভিন্ন আচরণ রয়েছে। এটি এমন একটি বস্তুকে নতুন হিসাবে বিবেচনা করে এবং কেবল আরেকটি এন্ট্রি যোগ করে:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
id এবং id2 ভেরিয়েবল ভিন্ন হবে। ডাটাবেসের টেবিলে দুটি রেকর্ড যোগ করা হবে, প্রতিটি save() অপারেশনের জন্য একটি ।