CodeGym /Java Blog /এলোমেলো /আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন
John Squirrels
লেভেল 41
San Francisco

আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন

এলোমেলো দলে প্রকাশিত
এই নিবন্ধে, আপনি জাভার সবচেয়ে জনপ্রিয় এন্টারপ্রাইজ ফ্রেমওয়ার্কগুলির একটির সাথে পরিচিত হবেন এবং আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন তৈরি করবেন। হাইবারনেটের কথা শুনেননি? অথবা হয়তো আপনি এটি শুনেছেন, কিন্তু এটি ব্যবহার করেননি? অথবা হয়তো আপনি এটি ব্যবহার করার চেষ্টা করেছেন, কিন্তু ব্যর্থ? তিনটি ক্ষেত্রেই - কাট নীচে স্বাগতম :) আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 1 হ্যালো, সবাই! এই নিবন্ধে, আমি হাইবারনেট ফ্রেমওয়ার্কের প্রধান বৈশিষ্ট্য সম্পর্কে কথা বলব এবং আপনাকে আপনার প্রথম মিনি-অ্যাপ্লিকেশন লিখতে সাহায্য করব। এই জন্য, আমাদের প্রয়োজন:
  1. IntelliJ IDEA আলটিমেট সংস্করণ
    এটি অফিসিয়াল ওয়েবসাইট থেকে ডাউনলোড করুন এবং 30-দিনের ট্রায়াল সংস্করণ সক্রিয় করুন৷
  2. PostgreSQL - সবচেয়ে জনপ্রিয় আধুনিক ডাটাবেস ম্যানেজমেন্ট সিস্টেমগুলির মধ্যে একটি (DBMS)
  3. মাভেন (ইতিমধ্যেই IDEA পর্যন্ত সংযুক্ত)
  4. একটু ধৈর্য।
শুধু ক্ষেত্রে, আমি GitHub (codegym শাখা) এ অ্যাপ্লিকেশন কোড পোস্ট করেছি। নিবন্ধটি প্রাথমিকভাবে তাদের লক্ষ্য করে যারা আগে কখনও এই প্রযুক্তির সাথে কাজ করেনি, তাই আমি কোডের পরিমাণ কমিয়ে দিয়েছি। চল শুরু করি!

হাইবারনেট কি?

এটি সবচেয়ে জনপ্রিয় অবজেক্ট-রিলেশনাল ম্যাপিং (ORM) বাস্তবায়নের একটি। একটি অবজেক্ট-রিলেশনাল ম্যাপিং সফ্টওয়্যার অবজেক্ট এবং ডাটাবেস রেকর্ডের মধ্যে সম্পর্ককে সংজ্ঞায়িত করে। অবশ্যই, হাইবারনেটের খুব বিস্তৃত কার্যকারিতা রয়েছে, তবে আমরা সবচেয়ে সহজ ফাংশনগুলিতে ফোকাস করব। আমাদের লক্ষ্য হল একটি CRUD (তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন) অ্যাপ্লিকেশন তৈরি করা যা করতে সক্ষম হবে:
  1. ব্যবহারকারী (ব্যবহারকারী) তৈরি করুন, আইডি দ্বারা ডাটাবেসে তাদের অনুসন্ধান করুন, ডাটাবেসে তাদের ডেটা আপডেট করুন এবং ডাটাবেস থেকে মুছে দিন।
  2. ব্যবহারকারীদের গাড়ির বস্তু (অটো) বরাদ্দ করুন। ডাটাবেস থেকে গাড়ি তৈরি করুন, আপডেট করুন, খুঁজুন এবং মুছুন।
  3. অতিরিক্তভাবে, অ্যাপ্লিকেশনটিকে স্বয়ংক্রিয়ভাবে ডাটাবেস থেকে "মালিকহীন" গাড়িগুলি সরিয়ে ফেলা উচিত৷ অন্য কথায়, যখন একজন ব্যবহারকারী মুছে ফেলা হয়, তখন সেই ব্যবহারকারীর সমস্ত গাড়িও ডাটাবেস থেকে মুছে ফেলতে হবে।
আমাদের প্রকল্পটি এইভাবে গঠন করা হবে: আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 2আপনি দেখতে পাচ্ছেন, কিছুই জটিল নয়। কনফিগার সহ 6টি ক্লাস + 1 ফাইল। প্রথমে, IntelliJ IDEA-তে একটি নতুন Maven প্রকল্প তৈরি করুন। ফাইল -> নতুন প্রকল্প। প্রস্তাবিত প্রকল্পের ধরনগুলির মধ্যে থেকে Maven নির্বাচন করুন এবং পরবর্তী ধাপে যান। আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 3Apache Maven হল POM ফাইলে তাদের কাঠামোর বর্ণনার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে প্রকল্প তৈরি করার জন্য একটি কাঠামো। আপনার প্রোজেক্টের সম্পূর্ণ কাঠামো pom.xml-এ বর্ণনা করা হবে, একটি ফাইল যা IDEA নিজেই আপনার প্রোজেক্টের রুটে তৈরি করবে। প্রকল্প সেটিংসে, আপনাকে নিম্নলিখিত Maven সেটিংস নির্দিষ্ট করতে হবে: groupId এবং artifactId। প্রকল্পগুলিতে, গ্রুপআইডি সাধারণত কোম্পানি বা ব্যবসায়িক ইউনিটের একটি বিবরণ। কোম্পানির ডোমেইন নাম বা ওয়েবসাইট এখানে যেতে পারেন। পরিবর্তে, artifactId হল প্রকল্পের নাম। GroupdId এর জন্য, আপনি প্রবেশ করতে পারেন com.yourNickname.codegym। এটি অ্যাপ্লিকেশনের উপর কোন প্রভাব ফেলবে না। artifactId-এর জন্য, আপনার পছন্দের যেকোনো প্রকল্পের নাম বেছে নিন। সংস্করণ অপরিবর্তিত রাখা যেতে পারে. আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 4শেষ স্ক্রিনে, কেবল পূর্বে প্রবেশ করা ডেটা নিশ্চিত করুন।আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 5সুতরাং, আমরা প্রকল্প তৈরি করেছি। এখন যা করা বাকি আছে তা হল কিছু কোড লেখা এবং এটিকে কাজ করা :) প্রথম জিনিসগুলি প্রথমে: আমরা যদি একটি অ্যাপ্লিকেশন তৈরি করতে চাই যা একটি ডাটাবেসের সাথে কাজ করে, আমরা অবশ্যই একটি ডাটাবেস ছাড়া করতে পারি না! এখান থেকে PostgreSQL ডাউনলোড করুন (আমি সংস্করণ 9 ব্যবহার করছি)। PostgreSQL এর একটি ডিফল্ট ব্যবহারকারী 'postgres' রয়েছে — আপনি যখন ইনস্টল করবেন তখন আপনাকে এটির জন্য একটি পাসওয়ার্ড ভাবতে হবে। পাসওয়ার্ড ভুলে যাবেন না। আমরা পরে এটা প্রয়োজন হবে! (সাধারণভাবে, অ্যাপ্লিকেশানগুলিতে ডিফল্ট ডাটাবেস ব্যবহার করা খারাপ অভ্যাস, তবে আমরা আপনার নিজস্ব ডাটাবেস তৈরি করে আলসারের কারণের সংখ্যা কমাতে এটি করব)। আপনি যদি কমান্ড লাইন এবং SQL কোয়েরির সাথে বন্ধু না হন, তাহলে ভালো খবর আছে। IntelliJ IDEA ডাটাবেসের সাথে কাজ করার জন্য একটি সম্পূর্ণ উপযুক্ত ইউজার ইন্টারফেস প্রদান করে। আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 6(IDEA এর ডান ফলকে, ডাটাবেস ট্যাবে অবস্থিত)। একটি সংযোগ তৈরি করতে, "+" ক্লিক করুন এবং আমাদের ডেটা উত্স (PostgeSQL) নির্বাচন করুন৷ ব্যবহারকারী এবং ডাটাবেসের জন্য ক্ষেত্রগুলি পূরণ করুন (তাদের উভয়ের জন্য "পোস্টগ্রেস") এবং পোস্টগ্রেএসকিউএল ইনস্টলেশনের সময় সেট করা পাসওয়ার্ড লিখুন। প্রয়োজনে পোস্টগ্রেস ড্রাইভার ডাউনলোড করুন। আপনি একই পৃষ্ঠায় এটি করতে পারেন. ডাটাবেস সংযোগ প্রতিষ্ঠিত হয়েছে তা যাচাই করতে "পরীক্ষা সংযোগ" এ ক্লিক করুন। আপনি যদি "সফল" দেখতে পান তবে এগিয়ে যান। এখন আমরা আমাদের প্রয়োজনীয় টেবিল তৈরি করব। মোট দুটি থাকবে: ব্যবহারকারী এবং অটো। ব্যবহারকারীদের টেবিলের জন্য পরামিতি: আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 7নোট করুন যে id হল প্রাথমিক কী। আপনি যদি এসকিউএল-এ প্রাইমারি কী কী তা না জানেন, গুগল করে দেখুন। এটা গুরুত্বপূর্ণ. অটো টেবিলের জন্য সেটিংস: আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 8অটোস টেবিলের জন্য, আপনাকে একটি বিদেশী কী কনফিগার করতে হবে। এটা আমাদের টেবিল লিঙ্ক পরিবেশন করা হবে. আমি সুপারিশ করছি যে আপনি এটি সম্পর্কে আরও পড়ুন। সহজ করে বললে, এটি একটি বাহ্যিক টেবিলের উল্লেখ করে, আমাদের ক্ষেত্রে ব্যবহারকারীদের। যদি একটি গাড়ি আইডি = 1 সহ ব্যবহারকারীর হয়, তাহলে অটোগুলির user_id ক্ষেত্রটি 1 এর সমান হবে। এইভাবে আমরা আমাদের অ্যাপ্লিকেশনে ব্যবহারকারীদের তাদের গাড়ির সাথে যুক্ত করি। আমাদের autos টেবিলে, user_id ক্ষেত্রটি বিদেশী কী হিসাবে কাজ করবে। এটি ব্যবহারকারীদের টেবিলের আইডি ক্ষেত্র উল্লেখ করবে। আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 9সুতরাং, আমরা দুটি টেবিলের সাথে একটি ডাটাবেস তৈরি করেছি। জাভা কোড থেকে কীভাবে এটি পরিচালনা করা যায় তা বোঝার বাকি আছে। আমরা pom.xml ফাইল দিয়ে শুরু করব, যেখানে আমাদের প্রয়োজনীয় লাইব্রেরিগুলি অন্তর্ভুক্ত করতে হবে (মাভেনে তাদের নির্ভরতা বলা হয়)। সমস্ত গ্রন্থাগার কেন্দ্রীয় মাভেন সংগ্রহস্থলে সংরক্ষিত হয়। আপনি pom.xml-এ নির্দিষ্ট করা লাইব্রেরিগুলি আপনার প্রকল্পে ব্যবহারের জন্য উপলব্ধ। আপনার pom.xml এর মত হওয়া উচিত: আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 10কিছুই জটিল নয়, আপনি দেখতে পাচ্ছেন। PostgreSQL এবং হাইবারনেট ব্যবহারের জন্য আমরা শুধুমাত্র 2টি নির্ভরতা যোগ করেছি। এখন জাভা কোডে যাওয়া যাক। প্রকল্পে সমস্ত প্রয়োজনীয় প্যাকেজ এবং ক্লাস তৈরি করুন। শুরু করার জন্য, আমাদের একটি ডেটা মডেল প্রয়োজন: Userএবং Autoক্লাস।

 package models;
 
 import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 
 @Entity
 @Table (name = "users")
 public class User {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;
     @Column(name = "name")
     private String name;
     // You can omit the Column attribute if the name property matches the column name in the table
     private int age;
 
     @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
     private List<Auto> autos;
 
     public User() {
     }
 
     public User(String name, int age) {
         this.name = name;
         this.age = age;
         autos = new ArrayList<>();
     }
 
     public void addAuto(Auto auto) {
         auto.setUser(this);
         autos.add(auto);
     }
 
     public void removeAuto(Auto auto) {
         autos.remove(auto);
     }
 
     public int getId() {
         return id;
     }
 
     public String getName() {
         return name;
     }
 
     public void setName(String name) {
         this.name = name;
     }
 
     public int getAge() {
         return age;
     }
 
     public void setAge(int age) {
         this.age = age;
     }
 
     public List<Auto> getAutos() {
         return autos;
     }
 
     public void setAutos(List<Auto> autos) {
         this.autos = autos;
     }
 
     @Override
     public String toString() {
         return "models.User{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
                 ", age=" + age +
                 '}';
     }
 }
 
 

 package models;
 
 import javax.persistence.*;
 
 @Entity
 @Table(name = "autos")
 public class Auto {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;
 
     @Column (name = "model")
     private String model;
 
     // You can omit the Column attribute if the name property matches the column name in the table
     private String color;
 
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "user_id")
     private User user;
 
     public Auto() {
     }
 
     public Auto(String model, String color) {
         this.model = model;
         this.color = color;
     }
 
     public int getId() {
         return id;
     }
 
     public String getModel() {
         return model;
     }
 
     public void setModel(String model) {
         this.model = model;
     }
 
     public String getColor() {
         return color;
     }
 
     public void setColor(String color) {
         this.color = color;
     }
 
     public User getUser() {
         return user;
     }
 
     public void setUser(User user) {
         this.user = user;
     }
 
     @Override
     public String toString() {
         return color + " " + model;
     }
 }
 
 
আপনি দেখতে পাচ্ছেন, ক্লাসে একগুচ্ছ অস্পষ্ট টীকা রয়েছে। তাদের মধ্যে খনন শুরু করা যাক. আমাদের জন্য, প্রধান টীকা হল @Entity. উইকিপিডিয়াতে এটি সম্পর্কে পড়ুন এবং হৃদয় দিয়ে এটি শিখুন। এটি ভিত্তির ভিত্তি। এই টীকাটি আপনার জাভা ক্লাসের বস্তুকে একটি ডাটাবেসে ম্যাপ করতে দেয়। একটি শ্রেণী একটি সত্তা হতে, এটি নিম্নলিখিত প্রয়োজনীয়তা পূরণ করতে হবে:
  • এটিতে একটি খালি কনস্ট্রাক্টর থাকতে হবে ( publicবা protected)
  • এটি নেস্ট করা যাবে না, একটি ইন্টারফেস বা একটিenum
  • এটি হতে পারে না finalএবং finalক্ষেত্র/বৈশিষ্ট্য থাকতে পারে না
  • এটিতে কমপক্ষে একটি @Id ক্ষেত্র থাকতে হবে।
আপনার সত্তা ক্লাস পরীক্ষা করুন: তারা পায়ে নিজেকে গুলি করার জন্য খুব জনপ্রিয় জায়গা। কিছু ভুলে যাওয়া খুব সহজ। অধিকন্তু, একটি সত্তা নিম্নলিখিতগুলি করতে পারে:
  • এটিতে অ-খালি কনস্ট্রাক্টর থাকতে পারে
  • এটি উত্তরাধিকার সূত্রে প্রাপ্ত এবং উত্তরাধিকারী হতে পারে
  • এটিতে অন্যান্য পদ্ধতি থাকতে পারে এবং ইন্টারফেস প্রয়োগ করতে পারে।
আপনি দেখতে পাচ্ছেন, Userক্লাসটি ব্যবহারকারীদের টেবিলের সাথে খুব মিল। এটা আছে id, name, এবংageক্ষেত্র তাদের উপরে অবস্থিত টীকাগুলির কোন বিশেষ ব্যাখ্যার প্রয়োজন নেই: এটা স্পষ্ট যে @Id নির্দেশ করে যে ক্ষেত্রটি এই শ্রেণীর বস্তুর একটি শনাক্তকারী। ক্লাসের উপরে @টেবিল টীকাটি টেবিলের নাম নির্দেশ করে যেখানে বস্তুগুলি লেখা আছে। বয়স ক্ষেত্রের উপরে মন্তব্যটি নোট করুন: যদি ক্লাসের ক্ষেত্রের নাম টেবিলের নামের মতো হয়, তাহলে আপনি @কলাম টীকাটি বাদ দিতে পারেন এবং এটি কাজ করবে। ধনুর্বন্ধনীতে নির্দেশিত অংশের জন্য ("কৌশল = GenerationType.IDENTITY"): আইডি তৈরি করার জন্য বেশ কয়েকটি কৌশল রয়েছে। আপনি তাদের Google করতে পারেন, কিন্তু আমাদের অ্যাপ্লিকেশনের জন্য, বিরক্ত করার দরকার নেই। মূল বিষয় হল আমাদের বস্তুর জন্য আইডির মান স্বয়ংক্রিয়ভাবে তৈরি হবে। তদনুসারে, আইডির জন্য কোনও সেটার নেই এবং আমরা এটি কনস্ট্রাক্টরেও সেট করি না। যাহোক,Userক্লাস স্ট্যান্ড আউট না. এটা গাড়ির তালিকা আছে! আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 11@OneToMany টীকাটি তালিকার উপরে ঝুলে আছে। এর মানে হল যে বেশ কয়েকটি গাড়ি ব্যবহারকারী শ্রেণীর একই বস্তুর সাথে মিলিত হতে পারে। "mappedBy" উপাদানটি ক্লাসের ব্যবহারকারী ক্ষেত্রকে বোঝায় Auto। সুতরাং, গাড়ি এবং ব্যবহারকারীরা সম্পর্কিত। অরফান রিমুভাল এলিমেন্ট ইঙ্গিত করে যে রিমুভ অপারেশনটি এমন সত্তাগুলিতে প্রয়োগ করা হবে যেগুলির আর সম্পর্ক নেই৷ আমরা যদি ডাটাবেস থেকে কোনও ব্যবহারকারীকে মুছে ফেলি, তবে এর সাথে যুক্ত সমস্ত গাড়িও মুছে যাবে। ঘুরে, মধ্যেAutoক্লাস, আপনি @ManyToOne টীকা (একজন ব্যবহারকারী অনেক অটোর সাথে সঙ্গতিপূর্ণ হতে পারে) এবং @JoinColumn টীকা সহ ব্যবহারকারী ক্ষেত্রটি দেখতে পাবেন। এটি নির্দেশ করে যে অটোস টেবিলের কোন কলামটি ব্যবহারকারীর টেবিলের উল্লেখ করতে ব্যবহৃত হয় (অর্থাৎ বিদেশী কী যা আমরা আগে বলেছি)। ডেটা মডেল তৈরি করার পর, ডাটাবেসের ডেটা দিয়ে ক্রিয়াকলাপ সম্পাদন করতে আমাদের প্রোগ্রামকে শেখানোর সময় এসেছে। আসুন হাইবারনেট সেশনফ্যাক্টরি ইউটিল ইউটিলিটি ক্লাস দিয়ে শুরু করি। এটির একটি মাত্র কাজ আছে - ডাটাবেসের সাথে কাজ করার জন্য আমাদের অ্যাপ্লিকেশনের জন্য একটি সেশন ফ্যাক্টরি তৈরি করা (ফ্যাক্টরি ডিজাইন প্যাটার্নকে হ্যালো বলুন!) এটা কিভাবে অন্য কিছু করতে জানে না.

 package utils;
 
 import models.Auto;
 import models.User;
 import org.hibernate.SessionFactory;
 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 import org.hibernate.cfg.Configuration;
 
 public class HibernateSessionFactoryUtil {
     private static SessionFactory sessionFactory;
 
     private HibernateSessionFactoryUtil() {}
 
     public static SessionFactory getSessionFactory() {
         if (sessionFactory == null) {
             try {
                 Configuration configuration = new Configuration().configure();
                 configuration.addAnnotatedClass(User.class);
                 configuration.addAnnotatedClass(Auto.class);
                 StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
                 sessionFactory = configuration.buildSessionFactory(builder.build());
 
             } catch (Exception e) {
                 System.out.println("Исключение!" + e);
             }
         }
         return sessionFactory;
     }
 }
 
এই ক্লাসে, আমরা একটি নতুন কনফিগারেশন অবজেক্ট তৈরি করি, এবং এটিকে সেই ক্লাসগুলি পাস করি যা এটিকে সত্তা হিসাবে বিবেচনা করা উচিত: Userএবং Auto। পদ্ধতিতে মনোযোগ দিন configuration.getProperties()। অন্যান্য বৈশিষ্ট্য কি আছে? ওরা কোথা থেকে আসে? বৈশিষ্ট্য হল বিশেষ hibernate.cfg.xml ফাইলে নির্দেশিত হাইবারনেট সেটিংস। আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 12Hibernate.cfg.xml এখানে পড়া হয়েছে: new Configuration().configure(); আপনি দেখতে পাচ্ছেন, এতে বিশেষ কিছু নেই: এতে ডাটাবেসের সাথে সংযোগ করার পরামিতি রয়েছে, সেইসাথে show_sql প্যারামিটার রয়েছে। এটি প্রয়োজনীয় যাতে হাইবারনেট দ্বারা সম্পাদিত সমস্ত sql প্রশ্ন কনসোলে প্রদর্শিত হয়। এইভাবে আপনি দেখতে পাবেন যে কোন মুহুর্তে হাইবারনেট ঠিক কি করছে, "জাদু" এর কোনো অনুভূতি দূর করে। পরবর্তী আমরা প্রয়োজনUserDAOক্লাস সর্বোত্তম অনুশীলন হল ইন্টারফেসের মাধ্যমে প্রোগ্রাম করা - একটি পৃথক UserDAOইন্টারফেস এবং UserDAOImplবাস্তবায়ন তৈরি করুন, তবে কোডের পরিমাণ কমাতে আমি এটি এড়িয়ে যাব। বাস্তব প্রকল্পে এটি করবেন না! DAO (ডেটা অ্যাক্সেস অবজেক্ট) ডিজাইন প্যাটার্ন সবচেয়ে সাধারণ এক। ধারণাটি সহজ - শুধুমাত্র ডেটা অ্যাক্সেসের জন্য দায়ী একটি অ্যাপ্লিকেশন স্তর তৈরি করুন, এর বেশি কিছু নয়। ডাটাবেস থেকে ডেটা আনুন, ডেটা আপডেট করুন, ডেটা মুছুন — এটাই। DAO সম্পর্কে আরও অধ্যয়ন করুন। আপনি আপনার কাজে ক্রমাগত ডেটা অ্যাক্সেস অবজেক্ট ব্যবহার করবেন। আমাদের UserDaoক্লাস কি করতে পারে? ঠিক আছে, সমস্ত DAO-এর মতো, এটি শুধুমাত্র ডেটা দিয়ে কাজ করতে পারে। আইডি দ্বারা একজন ব্যবহারকারী খুঁজুন, তার ডেটা আপডেট করুন, এটি মুছুন, ডাটাবেস থেকে সমস্ত ব্যবহারকারীর একটি তালিকা পান, বা ডাটাবেসে একজন নতুন ব্যবহারকারী সংরক্ষণ করুন - এটি তার কার্যকারিতার সম্পূর্ণতা।

 package dao;
 
 import models.Auto;
 import models.User;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
 import utils.HibernateSessionFactoryUtil;
 import java.util.List;
 
 public class UserDao {
 
     public User findById(int id) {
         return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(User.class, id);
     }
 
     public void save(User user) {
         Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
         Transaction tx1 = session.beginTransaction();
         session.save(user);
         tx1.commit();
         session.close();
     }
 
     public void update(User user) {
         Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
         Transaction tx1 = session.beginTransaction();
         session.update(user);
         tx1.commit();
         session.close();
     }
 
     public void delete(User user) {
         Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
         Transaction tx1 = session.beginTransaction();
         session.delete(user);
         tx1.commit();
         session.close();
     }
 
     public Auto findAutoById(int id) {
         return HibernateSessionFactoryUtil.getSessionFactory().openSession().get(Auto.class, id);
     }
 
     public List<User> findAll() {
         List<User> users = (List<User>) HibernateSessionFactoryUtil.getSessionFactory().openSession().createQuery("From User").list();
         return users;
     }
 }
 
UserDaoএর পদ্ধতিগুলি একে অপরের অনুরূপ। তাদের বেশিরভাগের মধ্যে, আমরা আমাদের সেশন ফ্যাক্টরি ব্যবহার করে একটি সেশন অবজেক্ট (ডাটাবেস সংযোগ সেশন) পাই, এই সেশনের মধ্যে একটি একক লেনদেন তৈরি করি, প্রয়োজনীয় ডেটা ম্যানিপুলেশন সঞ্চালন করি, ডাটাবেসে লেনদেনের ফলাফল সংরক্ষণ করি এবং তারপর সেশনটি বন্ধ করি। পদ্ধতিগুলি নিজেরাই, আপনি দেখতে পাচ্ছেন, বেশ সহজ। DAO হল আমাদের আবেদনের "হৃদয়"। যাইহোক, আমরা সরাসরি একটি DAO তৈরি করব না এবং এর পদ্ধতিগুলিকে আমাদের পদ্ধতিতে কল করব না main()। সমস্ত যুক্তি ক্লাসে সরানো হবে UserService

 package services;
 
 import dao.UserDao;
 import models.Auto;
 import models.User;
 
 import java.util.List;
 
 public class UserService {
 
     private UserDao usersDao = new UserDao();
 
     public UserService() {
     }
 
     public User findUser(int id) {
         return usersDao.findById(id);
     }
 
     public void saveUser(User user) {
         usersDao.save(user);
     }
 
     public void deleteUser(User user) {
         usersDao.delete(user);
     }
 
     public void updateUser(User user) {
         usersDao.update(user);
     }
 
     public List<User> findAllUsers() {
         return usersDao.findAll();
     }
 
     public Auto findAutoById(int id) {
         return usersDao.findAutoById(id);
     }
 
 
 }
 
 
একটি পরিষেবা হল একটি অ্যাপ্লিকেশন ডেটা স্তর যা ব্যবসায়িক যুক্তি সম্পাদনের জন্য দায়ী। আপনার প্রোগ্রামের যদি কিছু ধরণের ব্যবসায়িক যুক্তি চালানোর প্রয়োজন হয় তবে এটি পরিষেবাগুলির মাধ্যমে তা করে। একটি পরিষেবা একটি ধারণ করে UserDaoএবং তার পদ্ধতিতে DAO পদ্ধতিকে কল করে। এটা মনে হতে পারে যে আমরা এখানে ফাংশন ডুপ্লিকেট করছি (কেন শুধুমাত্র একটি DAO অবজেক্ট থেকে পদ্ধতিগুলিকে কল করব না?), কিন্তু প্রচুর অবজেক্ট এবং জটিল যুক্তি সহ, অ্যাপ্লিকেশনটিকে লেয়ার করা বিশাল সুবিধা প্রদান করে (এটি করা ভাল অভ্যাস - ভবিষ্যতে এটি মনে রাখবেন এবং "অ্যাপ্লিকেশন স্তর" সম্পর্কে পড়ুন)। আমাদের পরিষেবার সহজ যুক্তি আছে, কিন্তু বাস্তব-বিশ্বের প্রকল্পগুলিতে পরিষেবা পদ্ধতিতে একাধিক লাইনের কোড থাকে :) এখন আমাদের কাছে অ্যাপ্লিকেশন চালানোর জন্য যা যা প্রয়োজন তা আমাদের কাছে রয়েছে! পদ্ধতিতে main(), আসুন একটি ব্যবহারকারী এবং তার গাড়ি তৈরি করি, একটিকে অন্যটির সাথে সংযুক্ত করি এবং সেগুলিকে ডাটাবেসে সংরক্ষণ করি।

 import models.Auto;
 import models.User;
 import services.UserService;
 
 import java.sql.SQLException;
 
 public class Main {
     public static void main(String[] args) throws SQLException {
 
         UserService userService = new UserService();
         User user = new User ("Jenny", 26);
         userService.saveUser(user);
         Auto ferrari = new Auto("Ferrari", "red");
         ferrari.setUser(user);
         user.addAuto(ferrari);
         Auto ford = new Auto("Ford", "black");
         ford.setUser(user);
         user.addAuto(ford);
         userService.updateUser(user);
     }
 }
 
 
আপনি দেখতে পাচ্ছেন, ব্যবহারকারীর টেবিলের নিজস্ব রেকর্ড রয়েছে এবং অটো টেবিলের নিজস্ব রেকর্ড রয়েছে। আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 13আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 14আসুন আমাদের ব্যবহারকারীর নাম পরিবর্তন করার চেষ্টা করি। ব্যবহারকারীদের টেবিল সাফ করুন এবং কোডটি কার্যকর করুন

 import models.Auto;
 import models.User;
 import services.UserService;
 
 import java.sql.SQLException;
 
 public class Main {
     public static void main(String[] args) throws SQLException {
 
         UserService userService = new UserService();
         User user = new User ("Jenny", 26);
         userService.saveUser(user);
         Auto ferrari = new Auto("Ferrari", "red");
         user.addAuto(ferrari);
         Auto ford = new Auto("Ford", "black");
         ford.setUser(user);
         user.addAuto(ford);
         userService.updateUser(user);
         user.setName ("Benny");
         userService.updateUser(user);
     }
 }
 
 
এটা কাজ করে! আপনার প্রথম হাইবারনেট অ্যাপ্লিকেশন - 15আপনি ব্যবহারকারী মুছে ফেললে কি হবে? ব্যবহারকারীদের টেবিল সাফ করুন (অটোস নিজেই সাফ করবে) এবং কোডটি চালান

 import models.Auto;
 import models.User;
 import services.UserService;
 
 import java.sql.SQLException;
 
 public class Main {
     public static void main(String[] args) throws SQLException {
 
         UserService userService = new UserService();
         User user = new User ("Jenny", 26);
         userService.saveUser(user);
         Auto ferrari = new Auto("Ferrari", "red");
         user.addAuto(ferrari);
         Auto ford = new Auto("Ford", "black");
         ford.setUser(user);
         user.addAuto(ford);
         userService.updateUser(user);
         user.setName ("Benny");
         userService.updateUser(user);
         userService.deleteUser(user);
     }
 }
 
 
এবং আমাদের টেবিলগুলি সম্পূর্ণ খালি (কনসোলে মনোযোগ দিন — হাইবারনেট দ্বারা সম্পাদিত সমস্ত অনুরোধ সেখানে প্রদর্শিত হবে)। আপনি অ্যাপ্লিকেশনটির সাথে খেলতে পারেন এবং এর সমস্ত ফাংশন চেষ্টা করে দেখতে পারেন। উদাহরণস্বরূপ, গাড়ি দিয়ে একজন ব্যবহারকারী তৈরি করুন, এটি ডাটাবেসে সংরক্ষণ করুন, ব্যবহারকারীকে দেওয়া আইডিটি দেখুন এবং এই আইডিটি ব্যবহার করার চেষ্টা করুনmain()ডাটাবেস থেকে ব্যবহারকারীকে আনার পদ্ধতি এবং কনসোলে তার গাড়ির একটি তালিকা প্রদর্শন করা। অবশ্যই, আমরা হাইবারনেটের কার্যকারিতার একটি ছোট অংশ দেখেছি। এর ক্ষমতাগুলি খুব বিস্তৃত, এবং এটি জাভা ডেভেলপমেন্টের জন্য দীর্ঘদিন ধরে একটি আদর্শ শিল্প সরঞ্জাম। আপনি যদি এটি বিস্তারিতভাবে অধ্যয়ন করতে চান তবে আমি "জাভা পারসিস্টেন্স API এবং হাইবারনেট" বইটি সুপারিশ করতে পারি। আমি আগের একটি নিবন্ধে পর্যালোচনা. আমি আশা করি এই নিবন্ধটি পাঠকদের জন্য সহায়ক হয়েছে। আপনার যদি প্রশ্ন থাকে, মন্তব্যে তাদের জিজ্ঞাসা করুন. আমি উত্তর দিতে খুশি হব :) এছাড়াও, "লাইক" পোস্ট করে প্রতিযোগিতায় লেখককে সমর্থন করতে ভুলবেন না। অথবা আরও ভাল - "এটি ভালোবাসি" :) আপনার পড়াশোনায় সৌভাগ্য কামনা করছি!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION