CodeGym /جاوا بلاگ /Random-UR /آپ کی پہلی ہائبرنیٹ درخواست
John Squirrels
سطح
San Francisco

آپ کی پہلی ہائبرنیٹ درخواست

گروپ میں شائع ہوا۔
اس مضمون میں، آپ جاوا کے لیے سب سے مشہور انٹرپرائز فریم ورک سے واقف ہو جائیں گے اور اپنی پہلی ہائبرنیٹ ایپلیکیشن بنائیں گے۔ ہائبرنیٹ کے بارے میں کبھی نہیں سنا؟ یا شاید آپ نے اس کے بارے میں سنا ہے، لیکن اسے استعمال نہیں کیا؟ یا ہوسکتا ہے کہ آپ نے اسے استعمال کرنے کی کوشش کی، لیکن ناکام رہے؟ تینوں صورتوں میں - نیچے کٹ میں خوش آمدید :) آپ کی پہلی ہائبرنیٹ درخواست - 1 ہیلو، سب! اس مضمون میں، میں ہائبرنیٹ فریم ورک کی اہم خصوصیات کے بارے میں بات کروں گا اور آپ کی پہلی منی ایپلیکیشن لکھنے میں مدد کروں گا۔ اس کے لیے ہمیں ضرورت ہے:
  1. IntelliJ IDEA Ultimate Edition
    اسے آفیشل ویب سائٹ سے ڈاؤن لوڈ کریں اور 30 ​​دن کے آزمائشی ورژن کو فعال کریں۔
  2. PostgreSQL - جدید ترین ڈیٹا بیس مینجمنٹ سسٹمز (DBMS) میں سے ایک
  3. Maven (پہلے سے ہی IDEA تک وائرڈ ہے)
  4. تھوڑا صبر۔
صرف اس صورت میں، میں نے درخواست کوڈ GitHub پر پوسٹ کیا ہے ۔ مضمون بنیادی طور پر ان لوگوں کے لیے ہے جنہوں نے پہلے کبھی اس ٹیکنالوجی کے ساتھ کام نہیں کیا، اس لیے میں نے کوڈ کی مقدار کو کم سے کم کر دیا ہے۔ آو شروع کریں!

ہائبرنیٹ کیا ہے؟

یہ سب سے زیادہ مقبول آبجیکٹ-ریلیشنل میپنگ (ORM) کے نفاذ میں سے ایک ہے۔ ایک آبجیکٹ-ریلیشنل میپنگ سافٹ ویئر آبجیکٹ اور ڈیٹا بیس ریکارڈ کے درمیان تعلق کی وضاحت کرتی ہے۔ بلاشبہ، ہائبرنیٹ میں بہت وسیع فعالیت ہے، لیکن ہم سب سے آسان افعال پر توجہ مرکوز کریں گے۔ ہمارا مقصد ایک CRUD (تخلیق، پڑھیں، اپ ڈیٹ، حذف) ایپلی کیشن بنانا ہے جو اس قابل ہو گی:
  1. صارفین (صارف) بنائیں، انہیں ڈیٹا بیس میں ID کے ذریعے تلاش کریں، ڈیٹا بیس میں ان کا ڈیٹا اپ ڈیٹ کریں، اور انہیں ڈیٹا بیس سے حذف کریں۔
  2. صارفین کو کار آبجیکٹ (آٹو) تفویض کریں۔ ڈیٹا بیس سے کاریں بنائیں، اپ ڈیٹ کریں، تلاش کریں اور حذف کریں۔
  3. مزید برآں، ایپلیکیشن کو ڈیٹا بیس سے "مالک کے بغیر" کاروں کو خود بخود ہٹا دینا چاہیے۔ دوسرے لفظوں میں، جب صارف کو حذف کر دیا جاتا ہے، تو اس صارف کی تمام کاروں کو بھی ڈیٹا بیس سے حذف کر دینا چاہیے۔
ہمارے پروجیکٹ کو اس طرح بنایا جائے گا: آپ کی پہلی ہائبرنیٹ درخواست - 2جیسا کہ آپ دیکھ سکتے ہیں، کچھ بھی پیچیدہ نہیں ہے۔ ترتیب کے ساتھ 6 کلاسز + 1 فائل۔ سب سے پہلے، IntelliJ IDEA میں ایک نیا Maven پروجیکٹ بنائیں۔ فائل -> نیا پروجیکٹ۔ مجوزہ پروجیکٹ کی اقسام میں سے Maven کو منتخب کریں اور اگلے مرحلے پر جائیں۔ آپ کی پہلی ہائبرنیٹ درخواست - 3Apache Maven POM فائلوں میں ان کے ڈھانچے کی تفصیل کی بنیاد پر پروجیکٹوں کو خود بخود بنانے کا ایک فریم ورک ہے۔ آپ کے پروجیکٹ کا پورا ڈھانچہ pom.xml میں بیان کیا جائے گا، ایک فائل جسے IDEA خود آپ کے پروجیکٹ کی جڑ میں بنائے گا۔ پروجیکٹ کی ترتیبات میں، آپ کو مندرجہ ذیل Maven کی ترتیبات کی وضاحت کرنے کی ضرورت ہے: groupId اور artifactId۔ پروجیکٹس میں، گروپ آئی ڈی عام طور پر کمپنی یا کاروباری یونٹ کی تفصیل ہوتی ہے۔ کمپنی یا ویب سائٹ کا ڈومین نام یہاں جا سکتا ہے۔ بدلے میں، artifactId منصوبے کا نام ہے۔ گروپ آئی ڈی کے لیے، آپ درج کر سکتے ہیں com.yourNickname.codegym۔ اس کا اطلاق پر کوئی اثر نہیں پڑے گا۔ artifactId کے لیے، اپنی پسند کے کسی پروجیکٹ کا نام منتخب کریں۔ ورژن کو بغیر تبدیلی کے چھوڑا جا سکتا ہے۔ آپ کی پہلی ہائبرنیٹ درخواست - 4آخری اسکرین پر، صرف پہلے درج کردہ ڈیٹا کی تصدیق کریں۔ آپ کی پہلی ہائبرنیٹ درخواست - 5لہذا، ہم نے منصوبہ بنایا. اب بس کچھ کوڈ لکھنا اور اسے کام کرنا ہے :) سب سے پہلے: اگر ہم ایک ایسی ایپلی کیشن بنانا چاہتے ہیں جو ڈیٹا بیس کے ساتھ کام کرے، تو ہم یقینی طور پر ڈیٹا بیس کے بغیر نہیں کر سکتے! یہاں سے PostgreSQL ڈاؤن لوڈ کریں (میں ورژن 9 استعمال کر رہا ہوں)۔ PostgreSQL میں ایک ڈیفالٹ صارف 'postgres' ہوتا ہے — جب آپ انسٹال کرتے ہیں تو آپ کو اس کے لیے پاس ورڈ سوچنے کی ضرورت ہوگی۔ پاس ورڈ نہ بھولیں۔ ہمیں بعد میں اس کی ضرورت ہوگی! (عام طور پر، ایپلی کیشنز میں ڈیفالٹ ڈیٹا بیس کا استعمال ایک برا عمل ہے، لیکن ہم آپ کا اپنا ڈیٹا بیس بنا کر السر کی وجوہات کی تعداد کو کم کرنے کے لیے ایسا کریں گے)۔ اگر آپ کمانڈ لائن اور SQL سوالات کے دوست نہیں ہیں، تو اچھی خبر ہے۔ IntelliJ IDEA ڈیٹا بیس کے ساتھ کام کرنے کے لیے مکمل طور پر موزوں یوزر انٹرفیس فراہم کرتا ہے۔ یہ اس طرح لگتا ہے: آپ کی پہلی ہائبرنیٹ درخواست - 6(IDEA کے دائیں پین پر واقع ہے، ڈیٹا بیس ٹیب)۔ کنکشن بنانے کے لیے، "+" پر کلک کریں اور ہمارا ڈیٹا سورس (PostgeSQL) منتخب کریں۔ صارف اور ڈیٹا بیس (ان دونوں کے لیے "پوسٹگریس") کے لیے فیلڈز کو پُر کریں اور پاس ورڈ درج کریں جو PostgreSQL کی انسٹالیشن کے دوران سیٹ کیا گیا تھا۔ اگر ضروری ہو تو، پوسٹگریس ڈرائیور ڈاؤن لوڈ کریں۔ آپ یہ کام اسی صفحہ پر کر سکتے ہیں۔ ڈیٹا بیس کنکشن قائم ہونے کی تصدیق کرنے کے لیے "ٹیسٹ کنکشن" پر کلک کریں۔ اگر آپ کو "کامیاب" نظر آتا ہے، تو آگے بڑھیں۔ اب ہم وہ میزیں بنائیں گے جن کی ہمیں ضرورت ہے۔ کل دو ہوں گے: صارف اور آٹو۔ صارفین کی میز کے لیے پیرامیٹرز: آپ کی پہلی ہائبرنیٹ درخواست - 7نوٹ کریں کہ id بنیادی کلید ہے۔ اگر آپ نہیں جانتے کہ ایس کیو ایل میں بنیادی کلید کیا ہے تو اسے گوگل کریں۔ یہ اہم ہے. آٹو ٹیبل کے لیے ترتیبات: آپ کی پہلی ہائبرنیٹ درخواست - 8آٹوز ٹیبل کے لیے، آپ کو غیر ملکی کلید کو ترتیب دینے کی ضرورت ہے۔ یہ ہماری میزوں کو جوڑنے کے لیے کام کرے گا۔ میں تجویز کرتا ہوں کہ آپ اس کے بارے میں مزید پڑھیں۔ سیدھے الفاظ میں، یہ ایک بیرونی جدول کا حوالہ دیتا ہے، ہمارے معاملے میں، صارفین۔ اگر کوئی کار id = 1 والے صارف کی ہے، تو آٹوز کا user_id فیلڈ 1 کے برابر ہوگا۔ اس طرح ہم اپنی ایپلی کیشن میں صارفین کو ان کی کاروں سے منسلک کرتے ہیں۔ ہمارے آٹوز ٹیبل میں، user_id فیلڈ غیر ملکی کلید کے طور پر کام کرے گی۔ یہ یوزرز ٹیبل کے آئی ڈی فیلڈ کا حوالہ دے گا۔ آپ کی پہلی ہائبرنیٹ درخواست - 9لہذا، ہم نے دو میزوں کے ساتھ ایک ڈیٹا بیس بنایا ہے۔ یہ سمجھنا باقی ہے کہ جاوا کوڈ سے اس کا انتظام کیسے کیا جائے۔ ہم pom.xml فائل کے ساتھ شروع کریں گے، جس میں ہمیں ضروری لائبریریوں کو شامل کرنے کی ضرورت ہے (Maven میں انہیں انحصار کہا جاتا ہے)۔ تمام لائبریریاں مرکزی Maven ذخیرہ میں محفوظ ہیں۔ آپ pom.xml میں جن لائبریریوں کی وضاحت کرتے ہیں وہ آپ کے پروجیکٹ میں استعمال کرنے کے لیے دستیاب ہیں۔ آپ کا pom.xml اس طرح نظر آنا چاہئے: آپ کی پہلی ہائبرنیٹ درخواست - 10کچھ بھی پیچیدہ نہیں، جیسا کہ آپ دیکھ سکتے ہیں۔ پوسٹگری ایس کیو ایل اور ہائبرنیٹ استعمال کرنے کے لیے ہم نے صرف 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 اشارہ کرتا ہے کہ فیلڈ اس کلاس کی اشیاء کا شناخت کنندہ ہے۔ کلاس کے اوپر @Table تشریح اس ٹیبل کے نام کی نشاندہی کرتی ہے جہاں اشیاء لکھی گئی ہیں۔ عمر والے فیلڈ کے اوپر دیئے گئے تبصرے کو نوٹ کریں: اگر کلاس میں فیلڈ کا نام ٹیبل کے نام کے برابر ہے، تو آپ @Column تشریح کو چھوڑ سکتے ہیں اور یہ کام کرے گا۔ جہاں تک منحنی خطوط وحدانی میں اشارہ کیا گیا حصہ ("strategy = GenerationType.IDENTITY"): IDs بنانے کے لیے کئی حکمت عملی ہیں۔ آپ انہیں گوگل کر سکتے ہیں، لیکن ہماری درخواست کے لیے، پریشان ہونے کی ضرورت نہیں۔ اہم بات یہ ہے کہ ہماری اشیاء کے لیے id کی قدر خود بخود پیدا ہو جائے گی۔ اس کے مطابق، id کے لیے کوئی سیٹر نہیں ہے، اور ہم اسے کنسٹرکٹر میں بھی سیٹ نہیں کرتے ہیں۔ تاہم، کچھ ایسے طریقے ہیں جن سے Userکلاس نمایاں ہوتی ہے۔ اس میں کاروں کی فہرست ہے! آپ کی پہلی ہائبرنیٹ درخواست - 11 @OneToMany تشریح فہرست کے اوپر لٹکی ہوئی ہے۔ اس کا مطلب یہ ہے کہ متعدد کاریں یوزر کلاس کی ایک ہی چیز سے مطابقت رکھتی ہیں۔ "mappedBy" عنصر سے مراد کلاس کے صارف فیلڈ ہے Auto۔ اس طرح، کاریں اور صارفین آپس میں جڑے ہوئے ہیں۔ orphanRemoval عنصر اس بات کی نشاندہی کرتا ہے کہ آیا ہٹانے کی کارروائی کو ان اداروں پر لاگو کرنا ہے جن کا اب کوئی تعلق نہیں ہے۔ اگر ہم ڈیٹا بیس سے کسی صارف کو حذف کرتے ہیں، تو اس سے وابستہ تمام کاریں بھی حذف ہو جائیں گی۔ بدلے میں، کلاس میں Auto، آپ کو @ManyToOne تشریح (ایک صارف بہت سے آٹوز سے مطابقت رکھ سکتا ہے) اور @JoinColumn تشریح کے ساتھ صارف فیلڈ دیکھیں گے۔ یہ اس بات کی نشاندہی کرتا ہے کہ آٹوز ٹیبل میں کون سا کالم صارفین کے ٹیبل کا حوالہ دینے کے لیے استعمال ہوتا ہے (یعنی غیر ملکی کلید جس کے بارے میں ہم نے پہلے بات کی تھی)۔ ڈیٹا ماڈل بنانے کے بعد، اب وقت آگیا ہے کہ ہم اپنے پروگرام کو ڈیٹا بیس میں ڈیٹا کے ساتھ آپریشن کرنا سکھائیں۔ آئیے HibernateSessionFactoryUtil یوٹیلیٹی کلاس کے ساتھ شروع کریں۔ اس کا صرف ایک کام ہے — ڈیٹا بیس کے ساتھ کام کرنے کے لیے ہماری درخواست کے لیے سیشن فیکٹری بنانا (فیکٹری ڈیزائن پیٹرن کو ہیلو کہو!) یہ کچھ اور کرنا نہیں جانتا ہے۔
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("Exception!" + e);
            }
        }
        return sessionFactory;
    }
}
اس کلاس میں، ہم ایک نیا کنفیگریشن آبجیکٹ بناتے ہیں، اور اسے وہ کلاسز پاس کرتے ہیں جو اسے ہستی کے طور پر ماننا چاہیے: Userاور Auto۔ طریقہ کار پر توجہ دیں configuration.getProperties()۔ اس کے علاوہ کون سی خصوصیات ہیں؟ وہ کہاں سے آئے ہیں؟ پراپرٹیز ہائبرنیٹ سیٹنگز ہیں جو خصوصی hibernate.cfg.xml فائل میں بتائی گئی ہیں۔ آپ کی پہلی ہائبرنیٹ درخواست - 12Hibernate.cfg.xml یہاں پڑھا جاتا ہے: new Configuration().configure(); جیسا کہ آپ دیکھ رہے ہیں، اس میں کوئی خاص بات نہیں ہے: اس میں ڈیٹا بیس سے منسلک ہونے کے پیرامیٹرز کے ساتھ ساتھ show_sql پیرامیٹر بھی شامل ہے۔ اس کی ضرورت ہے تاکہ ہائبرنیٹ کے ذریعہ کئے گئے تمام sql سوالات کنسول پر ظاہر ہوں۔ اس طرح آپ بالکل دیکھیں گے کہ ہائبرنیٹ کسی بھی لمحے کیا کر رہا ہے، "جادو" کے کسی بھی احساس کو ختم کرتا ہے۔ اگلا ہمیں UserDAOکلاس کی ضرورت ہے۔ بہترین عمل انٹرفیس کے ذریعے پروگرام کرنا ہے - ایک علیحدہ UserDAOانٹرفیس بنائیں اور UserDAOImplعمل درآمد کریں، لیکن کوڈ کی مقدار کو کم کرنے کے لیے میں اسے چھوڑ دوں گا۔ حقیقی منصوبوں میں ایسا نہ کریں! ڈی اے او (ڈیٹا تک رسائی آبجیکٹ) ڈیزائن پیٹرن سب سے عام میں سے ایک ہے۔ آئیڈیا آسان ہے — ایک ایپلیکیشن پرت بنائیں جو صرف ڈیٹا تک رسائی کے لیے ذمہ دار ہے، مزید کچھ نہیں۔ ڈیٹا بیس سے ڈیٹا حاصل کریں، ڈیٹا کو اپ ڈیٹ کریں، ڈیٹا کو حذف کریں — بس۔ DAO کے بارے میں مزید مطالعہ کریں۔ آپ اپنے کام میں ڈیٹا تک رسائی والی اشیاء کو مسلسل استعمال کریں گے۔ ہماری UserDaoکلاس کیا کر سکتی ہے؟ ٹھیک ہے، تمام DAOs کی طرح، یہ صرف ڈیٹا کے ساتھ کام کر سکتا ہے۔ کسی صارف کو آئی ڈی کے ذریعے تلاش کریں، اس کا ڈیٹا اپ ڈیٹ کریں، اسے حذف کریں، ڈیٹا بیس سے تمام صارفین کی فہرست حاصل کریں، یا ڈیٹا بیس میں ایک نئے صارف کو محفوظ کریں — یہ اس کی مکمل فعالیت ہے۔
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