1.1 টেবিলে ক্লাস ম্যাপিং

JDBC শেখার পরে, আপনার সম্ভবত ধারণা আছে যে জাভা অ্যাপ্লিকেশন থেকে একটি ডাটাবেসের সাথে কাজ করা এখনও একটি আনন্দের বিষয়। যদি আমি আপনাকে বলি যে এই সমস্ত কাজ 10 গুণ সহজে করা যেতে পারে?

SQL ভাষার প্রধান সুবিধা কি? এটি একটি ঘোষণামূলক ভাষা - এটি আমরা কী পেতে চাই তা বর্ণনা করে এবং এটি কীভাবে করতে হবে সে সম্পর্কে কিছুই বলে না। কিভাবে - এটি এসকিউএল সার্ভারের উদ্বেগ।

ডাটাবেসের সাথে কাজ করার সময় একই পদ্ধতি ব্যবহার করা যেতে পারে।

একটি আদর্শ বিশ্বে, আমরা কেবলমাত্র ডাটাবেসে এসকিউএল কোয়েরি লিখতে পারি, এবং প্রতিক্রিয়া হিসাবে আমরা রেডিমেড জাভা অবজেক্ট বা জাভা অবজেক্টের সংগ্রহ পাব, যদি আমরা কয়েকটি টুকরো অনুরোধ করি।

আমি কি বলতে পারি, এটিই 2000 সালে বেশ কিছু লোক ভেবেছিল এবং তাদের নিজস্ব ORM ফ্রেমওয়ার্ক লেখার সিদ্ধান্ত নিয়েছে।

ORM এর অর্থ হল অবজেক্ট-রিলেশনাল ম্যাপিং এবং এটি মূলত এসকিউএল কোয়েরিতে জাভা অবজেক্টের ম্যাপিং।

ছেলেরা একটি খুব সাধারণ জিনিস নিয়ে এসেছিল - ডাটাবেসের প্রতিটি টেবিল অবশ্যই জাভা অ্যাপ্লিকেশনের কিছু ক্লাসের সাথে সঙ্গতিপূর্ণ হবে । একটি জাভা অ্যাপ্লিকেশনে, আমরা বস্তুর সাথে কাজ করি এবং এই বস্তুগুলি ইতিমধ্যেই জানে কিভাবে ডাটাবেসে নিজেদের সংরক্ষণ করতে হয়।

এই সমস্যাটি সমাধান করার জন্য তিনটি পন্থা ছিল, এবং তারা এইরকম কিছু দেখেছিল:

  1. বস্তুটি ডাটাবেসে নিজেকে সংরক্ষণ করে এবং ডাটাবেস থেকে তথ্যের ভিত্তিতে তার ক্ষেত্রগুলি আপডেট করে।
  2. বস্তুটি নিজেকে ডাটাবেসে সংরক্ষণ করতে সক্ষম, কিন্তু এই ক্ষেত্রে কখনই শুরু করে না।
  3. অবজেক্টে শুধুমাত্র ডেটা থাকে, এবং কেউ এটি ডাটাবেসে সংরক্ষণ করে এবং ডাটাবেস থেকে লোড করে।

প্রাথমিকভাবে, প্রথম পদ্ধতির প্রাধান্য ছিল, তারপরে অ্যাপ্লিকেশন সার্ভার এবং এন্টারপ্রাইজ জাভা বিন জনপ্রিয় ছিল। এমনকি পারসিস্টেন্স ইজেবি নামক একটি সম্পূর্ণ শ্রেণীও ছিল যা ডাটাবেসে নিজেদের সংরক্ষণ করতে পারে।

কিন্তু একদিন সব বদলে গেল...

1.2 হাইবারনেটের উত্থান

2001 সালে, হাইবারনেট ফ্রেমওয়ার্কের প্রথম সংস্করণ প্রকাশিত হয়েছিল। এটি একটি খুব সাধারণ কাঠামো ছিল, কিন্তু এটি সাধারণ "মূর্খ বস্তু" ব্যবহারের অনুমতি দেয় যেগুলি কীভাবে ডাটাবেসে সংরক্ষণ করা উচিত বা সেখান থেকে লোড করা উচিত সে সম্পর্কে কিছুই জানত না।

ডাটাবেসের একটি টেবিলে জাভা ক্লাস এবং কলামের ক্ষেত্রগুলির ম্যাপিং একটি XML ফাইল ব্যবহার করে সেট করা হয়েছিল। এবং কখনও কখনও তারা বেশ ভারী ছিল। ঠিক আছে, আমি কে মজা করছি. তারা XML কোডের ভারী ক্যানভাস ছিল। এবং পরিস্থিতি শুধুমাত্র এই সত্য দ্বারা সংরক্ষিত হয়েছিল যে 20 বছর আগে এখনকার মতো এত বিশাল ডেটাবেস ছিল না।

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

এবং ওআরএম পদ্ধতি সত্যিই সেই ধারণাটি ভেঙে দেয়। ডেটা ক্লাস তার অভ্যন্তরীণ কাঠামোকে প্রকাশ করে, তবে বিভিন্ন ধরণের বস্তুর গ্রুপগুলির সাথে কাজ করা অনেক সহজ হয়ে উঠেছে।

জাভা 5 প্রকাশের পরে একটি বড় অগ্রগতি এসেছিল , যখন জেডিকেতে দুটি জিনিস উপস্থিত হয়েছিল:

  • টীকা
  • প্রক্সি

টীকাXML দ্রুত প্রতিস্থাপিত হয়েছিল, এবং এখন জাভা ক্লাসের ডাটাবেসের একটি টেবিলে একটি জাভা ক্লাস ম্যাপ করার জন্য সমস্ত প্রয়োজনীয় সেটিংস নির্দিষ্ট করা সহজ ছিল।

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

এটি বিভিন্ন অলস লোডিং প্রক্রিয়া বাস্তবায়ন করা সম্ভব করেছে এবং হাইবারনেটের গতি এবং দক্ষতা সেই সময়ের জন্য সম্পূর্ণ আকাশ-উচ্চ স্তরে উন্নীত করেছে। হাইবারনেট কেবল একটি ডি ফ্যাক্টো ইন্ডাস্ট্রি স্ট্যান্ডার্ড হয়ে ওঠেনি - এটি অন্যান্য ভাষায় অনুবাদ করা শুরু হয়েছে। সুতরাং, উদাহরণস্বরূপ, ফ্রেমওয়ার্ক NHibernate C# এর জন্য উপস্থিত হয়েছে।

1.3 জেপিএর উত্থান

ডি ফ্যাক্টো এর পরে ডি ইউর স্বীকৃতি। JDK ডেভেলপাররা একটি নির্দিষ্টকরণ তৈরি করার সিদ্ধান্ত নিয়েছে কিভাবে সঠিকভাবে একটি ডাটাবেসের টেবিলে বস্তুর ম্যাপ করা যায়। এই স্পেসিফিকেশন বলা হয়জেপিএ- Java Persistence API।

এই ঠিক স্পেসিফিকেশন. এটি বর্ণনা করে যে কীভাবে সবকিছু কাজ করা উচিত এবং আমরা যদি ক্লাসের অবজেক্টগুলি ডাটাবেসে সংরক্ষিত করতে চাই তবে আমাদের ক্লাসের বিভিন্ন অংশ চিহ্নিত করতে কী কী টীকা দরকার।

দেখে মনে হচ্ছে ছেলেরা কেবল হাইবারনেটকে একটি ভিত্তি হিসাবে নিয়েছে এবং এটি থেকে প্যাকেজের নামগুলি পরিবর্তন করেছে। কারণ হাইবারনেটে থাকা সমস্ত টীকা প্রায় এক এক করে JPA-তে চলে গেছে।

আজ, হাইবারনেট সম্পূর্ণ JPA স্পেসিফিকেশন সম্পূর্ণরূপে প্রয়োগ করে, সেইসাথে কিছু অতিরিক্ত বৈশিষ্ট্য যা এটির সাথে কাজ করা আরও আরামদায়ক করে তোলে। অতএব, প্রমিতকরণের ক্ষেত্রে, আমরা বলতে পারি যে হাইবারনেটের বৈশিষ্ট্যগুলির দুটি সেট রয়েছে:

  • জেপিএ স্ট্যান্ডার্ড
  • হাইবারনেট নেটিভ API (অতিরিক্ত কার্যকারিতা)

অফিসিয়াল হাইবারনেট ডকুমেন্টেশন এটিকে এভাবে বর্ণনা করে:

কিন্তু উভয়ই আমার অভিজ্ঞতার উপর ভিত্তি করে এবং হাইবারনেট ডকুমেন্টেশন পুনরায় পড়ার পরে, আমি বলতে পারি যে JPA এবং হাইবারনেট API 95% একই। তারা শুধু অভিন্ন ধারণা.

1.4 হাইবারনেটের জন্য মাভেন

যেহেতু আমি হাইবারনেটের অনেক প্রশংসা করেছি, আমি মনে করি এটির সাথে একটু কঠিন কাজ করার সময় এসেছে।

প্রথমত, একটি অফিসিয়াল সাইট আছে, যেখানে ইংরেজি ভাষার ডকুমেন্টেশনের একটি গুচ্ছ রয়েছে। তার, অবশ্যই, রেফারেন্স তথ্যে একটি পক্ষপাত আছে, এবং প্রশিক্ষণে নয়। কিন্তু এটি এখনও উত্স ডিবাগ করার চেয়ে ভাল, তাই না? :)

নির্দেশ:

  1. আপনি লিঙ্কটি খুলুন ।
  2. তুমি তার দিকে অনেকক্ষণ তাকিয়ে থাকো।
  3. CodeGym-এ ফিরে আসছি।
  4. আপনি আমার পরবর্তী লেকচার পড়ুন.

আমার কাজ হল জটিল বিষয়গুলোকে সহজ করা এবং সহজ ভাষায় ব্যাখ্যা করা। এবং আপনি যদি এই স্তরে পৌঁছে থাকেন তবে আমি এটি করতে পারি।

ঠিক আছে, হাইবারনেটের সাথে শুরু করার জন্য, আপনাকে এটি আপনার pom.xml এ যোগ করতে হবে। আজ অবধি, হাইবারনেটের 6 তম সংস্করণ ইতিমধ্যে উপলব্ধ, বা বরং 6.1.1, তাই আমরা শিখব কিভাবে সর্বশেষ সংস্করণের সাথে কাজ করতে হয়।

শুধু আপনার pom.xml এ এই লাইন যোগ করুন:


<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

আপনি যদি 2023+ এর উইন্ডোর বাইরে এই বক্তৃতাটি পড়ছেন, তাহলে নতুন সংস্করণটি এখানে ডাউনলোড করা যেতে পারে ।

গুরুত্বপূর্ণ ! হাইবারনেট ব্যবহার করে এমন কিছু লাইব্রেরি JDK 11 এবং JDK 17-এ অবমূল্যায়িত করা হয়েছে, তাই আপনার যদি আপনার প্রোজেক্ট চালু করতে সমস্যা হয়, তাহলে এতে এই নির্ভরতা যোগ করুন:


  	<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
  	</dependency>