JavaRush /جاوا بلاگ /Random-UR /آپ کی پہلی ہائبرنیٹ درخواست

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

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

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

یہ ORM ماڈل کے مقبول ترین نفاذ میں سے ایک ہے۔ آبجیکٹ-ریلیشنل ماڈل ڈیٹا بیس میں سافٹ ویئر آبجیکٹ اور ریکارڈ کے درمیان تعلقات کو بیان کرتا ہے۔ بلاشبہ، ہائبرنیٹ کی فعالیت بہت وسیع ہے، لیکن ہم سب سے آسان افعال پر توجہ مرکوز کریں گے۔ ہمارا مقصد: ایک CRUD ایپلیکیشن (تخلیق، پڑھیں، اپ ڈیٹ، حذف) بنانا جو اس قابل ہو گی:
  1. یوزرز (صارف) بنائیں، نیز ڈیٹا بیس میں انہیں ID کے ذریعے تلاش کریں، ڈیٹا بیس میں ان کا ڈیٹا اپ ڈیٹ کریں، اور ڈیٹا بیس سے حذف بھی کریں۔
  2. گاڑیوں کی اشیاء (آٹو) صارفین کو تفویض کریں۔ ڈیٹا بیس سے کاریں بنائیں، ان میں ترمیم کریں، تلاش کریں اور حذف کریں۔
  3. اس کے علاوہ، ایپلیکیشن کو ڈیٹا بیس سے "یتیم" کاروں کو خود بخود ہٹا دینا چاہیے۔ وہ. جب صارف کو حذف کر دیا جاتا ہے، تو اس کی تمام کاروں کو بھی ڈیٹا بیس سے حذف کر دینا چاہیے۔
ہمارے پروجیکٹ کی ساخت اس طرح ہوگی: آپ کی پہلی ہائبرنیٹ درخواست - 2جیسا کہ آپ دیکھ سکتے ہیں، کچھ بھی پیچیدہ نہیں ہے۔ ترتیب کے ساتھ 6 کلاسز + 1 فائل۔ سب سے پہلے، آئیے Intellij Idea میں ایک نیا maven پروجیکٹ بنائیں۔ فائل -> نیا پروجیکٹ۔ مجوزہ پروجیکٹ کی اقسام میں سے، Maven کو منتخب کریں اور آگے بڑھیں۔ آپ کی پہلی ہائبرنیٹ درخواست - 3Apache Maven POM زبان میں فائلوں میں ان کے ڈھانچے کی تفصیل کی بنیاد پر منصوبوں کی اسمبلی کو خودکار بنانے کا ایک فریم ورک ہے۔ آپ کے پروجیکٹ کا پورا ڈھانچہ pom.xml فائل میں بیان کیا جائے گا، جسے IDEA خود آپ کے پروجیکٹ کی جڑ میں بنائے گا۔ پروجیکٹ کی ترتیبات میں آپ کو Maven پیرامیٹرز - groupId اور artifactId کی وضاحت کرنے کی ضرورت ہوگی۔ عام طور پر پروجیکٹس میں گروپ آئی ڈی تنظیم یا ڈویژن کا نام ہوتا ہے، اور وہاں تنظیم یا پروجیکٹ سائٹ کا ڈومین نام لکھا جاتا ہے۔ بدلے میں، artifactId منصوبے کا نام ہے۔ گروپ آئی ڈی کے لیے آپ وضاحت کر سکتے ہیں com.вашНикнейм.javarush، یہ کسی بھی طرح سے ایپلیکیشن کے آپریشن کو متاثر نہیں کرے گا۔ artifactId کے لیے، اپنی پسند کا کوئی بھی پروجیکٹ کا نام منتخب کریں۔ آپ ورژن کو بغیر تبدیلی کے بھی چھوڑ سکتے ہیں۔ آپ کی پہلی ہائبرنیٹ درخواست - 4آخری اسکرین پر، صرف اپنے پہلے درج کردہ ڈیٹا کی تصدیق کریں۔ آپ کی پہلی ہائبرنیٹ درخواست - 5لہذا، ہم نے پراجیکٹ بنایا ہے، صرف کوڈ لکھنا اور اسے کام کرنا باقی ہے :) سب سے پہلے، اگر ہم ایک ایسی ایپلی کیشن بنانا چاہتے ہیں جو ڈیٹا بیس کے ساتھ کام کرے، تو ہم یقینی طور پر ڈیٹا بیس کے بغیر نہیں کر سکتے! یہاں سے PostgreSQL ڈاؤن لوڈ کریں (میں ورژن 9 استعمال کرتا ہوں)۔ PostgreSQL میں ڈیفالٹ صارف 'postgres' ہے، آپ کو انسٹالیشن کے دوران اس کے لیے پاس ورڈ بنانا ہوگا۔ اپنا پاس ورڈ مت بھولنا، ہمیں بعد میں اس کی ضرورت ہوگی! (عام طور پر، ایپلی کیشنز میں پہلے سے طے شدہ ڈیٹا بیس کا استعمال برا عمل ہے، لیکن بواسیر کی مقدار کو کم کرنے کے لیے، ہم خود اپنا ڈیٹا بیس بنائیں گے)۔ اگر آپ کمانڈ لائن اور ایس کیو ایل کے سوالات سے مطمئن نہیں ہیں تو اچھی خبر ہے۔ Intellij IDEA ڈیٹا بیس کے ساتھ کام کرنے کے لیے کافی مناسب یوزر انٹرفیس فراہم کرتا ہے۔ یہ اس طرح لگتا ہے: آپ کی پہلی ہائبرنیٹ درخواست - 6(IDEA کے دائیں سائڈبار پر واقع ہے، ڈیٹا بیس ٹیب) کنکشن بنانے کے لیے، "+" پر کلک کریں، ہمارا فراہم کنندہ (PostgeSQL) منتخب کریں۔ صارف، ڈیٹا بیس کے نام (دونوں پوسٹگریس ہیں) کے ساتھ فیلڈز کو پُر کریں اور وہ پاس ورڈ درج کریں جو آپ PostgreSQL انسٹال کرتے وقت سیٹ کرتے ہیں۔ اگر ضروری ہو تو، پوسٹگریس ڈرائیور ڈاؤن لوڈ کریں، یہ اسی صفحہ پر کیا جا سکتا ہے۔ چیک کرنے کے لیے "ٹیسٹ کنکشن" پر کلک کریں کہ ڈیٹا بیس سے کنکشن قائم ہو گیا ہے۔ اگر آپ "کامیاب" لکھا ہوا دیکھتے ہیں، تو ہم آگے بڑھتے ہیں۔ اب آئیے وہ میزیں بنائیں جن کی ہمیں ضرورت ہے۔ ان میں سے دو ہوں گے - صارف اور آٹو۔ صارفین کی میز کے لیے پیرامیٹرز: ہائبرنیٹ پر آپ کی پہلی درخواست - 7براہ کرم نوٹ کریں کہ id بنیادی کلید ہے۔ اگر آپ نہیں جانتے کہ ایس کیو ایل میں بنیادی کلید کیا ہے تو گوگل کریں، یہ ضروری ہے۔ آٹو ٹیبل کے لیے ترتیب: ہائبرنیٹ پر آپ کی پہلی درخواست - 8آٹوز کے لیے آپ کو فارن کی - فارن کی کو کنفیگر کرنا ہوگا۔ یہ ہماری میزوں کو جوڑ دے گا۔ میں آپ کو مشورہ دیتا ہوں کہ اس کے بارے میں مزید پڑھیں؛ اسے بہت آسان الفاظ میں، یہ ایک بیرونی جدول سے مراد ہے، ہمارے معاملے میں، صارفین۔ اگر کار id=1 والے صارف کی ہے، تو آٹوز ٹیبل کے user_id فیلڈ میں اس کا 1 ہوگا۔ اس طرح ہم اپنی ایپلی کیشن میں صارفین کو ان کی کاروں سے جوڑتے ہیں۔ ہمارے آٹو ٹیبل میں، user_id فیلڈ ایک غیر ملکی کلید کے طور پر کام کرے گا۔ یہ یوزرز ٹیبل کے آئی ڈی فیلڈ کا حوالہ دے گا۔ آپ کی پہلی ہائبرنیٹ درخواست - 9اس طرح، ہم نے دو ٹیبلز کے ساتھ ایک ڈیٹا بیس بنایا ہے۔ یہ سمجھنا باقی ہے کہ جاوا کوڈ سے اس کا انتظام کیسے کریں۔ ہم pom.xml فائل کے ساتھ شروع کریں گے، جس میں ہمیں ضروری لائبریریوں کو شامل کرنے کی ضرورت ہے (ماون زبان میں انہیں انحصار کہا جاتا ہے)۔ تمام لائبریریاں مرکزی 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 not specify Column name if it matches the name of the column 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 not specify Column name if it matches the name of the column 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" کے بارے میں: آئی ڈی بنانے کی کئی حکمت عملییں ہیں۔ آپ اسے گوگل کر سکتے ہیں، لیکن ہماری درخواست کے فریم ورک کے اندر آپ کو پریشان ہونے کی ضرورت نہیں ہے۔ اہم بات یہ ہے کہ ہمارے آبجیکٹ کے لیے آئی ڈیز خود بخود تیار ہوں گی، اس لیے آئی ڈی کے لیے کوئی سیٹٹر نہیں ہے، اور ہم اسے کنسٹرکٹر میں بھی نہیں بتاتے ہیں۔ تاہم، کلاس اب بھی کچھ طریقوں Userسے الگ ہے ۔ اس کے پاس کاروں کی فہرست ہے! @OneToMany تشریح فہرست کے اوپر ظاہر ہوتی ہے۔ اس کا مطلب یہ ہے کہ صارف طبقے کی ایک چیز کئی مشینوں سے مطابقت رکھتی ہے۔ "mappedBY" ترتیب کلاس کے صارف فیلڈ کی طرف اشارہ کرتی ہے Auto۔ اس طرح مشینیں اور صارف ایک دوسرے سے جڑے رہتے ہیں۔ orphanRemoval ترتیب کا انگریزی سے بہت اچھا ترجمہ ہوتا ہے - "remove orphans"۔ اگر ہم ڈیٹا بیس سے کسی صارف کو حذف کرتے ہیں تو اس کے ساتھ منسلک تمام کاریں بھی حذف ہو جائیں گی۔ بدلے میں، کلاس میں 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 میں بیان کردہ پیرامیٹرز ہیں۔ آپ کی پہلی ہائبرنیٹ درخواست - 11Hibernate.cfg.xml یہاں پڑھا جاتا ہے: new Configuration().configure(); جیسا کہ آپ دیکھ سکتے ہیں، اس میں کچھ خاص نہیں ہے - ڈیٹا بیس سے منسلک ہونے کے لیے پیرامیٹرز، اور ایک خاص پیرامیٹر show_sql۔ اس کی ضرورت ہے تاکہ وہ تمام ایس کیو ایل سوالات جو ہمارے ڈیٹا بیس کے خلاف ہائبرنیٹ کریں گے کنسول میں آؤٹ پٹ ہوں۔ اس طرح، آپ بالکل دیکھیں گے کہ ہائبرنیٹ ہر لمحے وقت کے ساتھ کیا کر رہا ہے اور "جادو" اثر سے چھٹکارا پائیں گے۔ اگلا ہمیں کلاس کی ضرورت ہے UserDAO۔ (اچھے طریقے سے، آپ کو انٹرفیس کے ذریعے پروگرام کرنے کی ضرورت ہے - ایک انٹرفیس بنائیں UserDAOاور اسے الگ سے لاگو کریں UserDAOImpl، لیکن کوڈ کی مقدار کو کم کرنے کے لیے میں اسے چھوڑ دوں گا۔ حقیقی پروجیکٹس میں ایسا نہ کریں!) ڈی اے او (ڈیٹا تک رسائی آبجیکٹ) سب سے عام ڈیزائن پیٹرن میں سے ایک ہے، "ڈیٹا تک رسائی"۔ اس کا مطلب آسان ہے - ایپلیکیشن میں ایک پرت بنانا جو صرف ڈیٹا تک رسائی کے لیے ذمہ دار ہے، اور کچھ نہیں۔ ڈیٹا بیس سے ڈیٹا حاصل کریں، ڈیٹا کو اپ ڈیٹ کریں، ڈیٹا کو حذف کریں - اور بس۔ DAOs کے بارے میں مزید پڑھیں؛ آپ انہیں اپنے کام میں مسلسل استعمال کریں گے۔ ہماری کلاس کیا کر سکتی ہے 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 طریقوں کو کال کرتی ہے۔ یہ آپ کو فنکشنز کی نقل کی طرح لگتا ہے (کیوں نہ صرف ڈاؤ آبجیکٹ سے کال کرنے کے طریقے)، لیکن بڑی تعداد میں اشیاء اور پیچیدہ منطق کے ساتھ، ایپلی کیشن کو تہوں میں توڑنے کے بہت بڑے فوائد ہیں (یہ اچھا عمل ہے، اس معلومات کو یاد رکھیں مستقبل اور "درخواست کی تہوں" کے بارے میں پڑھیں)۔ ہماری خدمت میں، منطق آسان ہے، لیکن حقیقی پروجیکٹس میں، سروس کے طریقوں میں ایک سے زیادہ کوڈ کی سطریں ہوں گی :) اب ہمارے پاس ایپلی کیشن کے کام کرنے کے لیے درکار ہر چیز موجود ہے! آئیے 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("Masha",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("Masha",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("Sasha");
        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("Masha",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("Sasha");
        userService.updateUser(user);
        userService.deleteUser(user);
    }
}
اور ہماری میزیں مکمل طور پر خالی ہیں (کنسول پر دھیان دیں، تمام سوالات جو ہائبرنیٹ نے انجام دیے ہیں وہ وہاں دکھائے جائیں گے)۔ آپ ایپلی کیشن کے ساتھ کھیل سکتے ہیں اور اس کی تمام خصوصیات کو آزما سکتے ہیں۔ مثال کے طور پر، مشینوں کے ساتھ صارف بنائیں، اسے ڈیٹا بیس میں محفوظ کریں، دیکھیں کہ اسے کیا آئی ڈی تفویض کی گئی ہے، اور main()اس آئی ڈی کے ذریعے صارف کو ڈیٹا بیس سے "کھینچنے" کا طریقہ استعمال کرنے کی کوشش کریں اور کنسول میں اس کی مشینوں کی فہرست دکھائیں۔ . بلاشبہ، ہم نے ہائبرنیٹ کی فعالیت کا صرف ایک چھوٹا سا حصہ دیکھا۔ اس کی صلاحیتیں بہت وسیع ہیں، اور یہ جاوا کی ترقی کے لیے طویل عرصے سے صنعتی معیارات میں سے ایک رہا ہے۔ اگر آپ اس کا تفصیل سے مطالعہ کرنا چاہتے ہیں، تو میں کتاب "جاوا پرسسٹینس API اور ہائبرنیٹ" تجویز کر سکتا ہوں، جس کا میں نے اپنے پچھلے مضامین میں سے ایک میں جائزہ لیا تھا ۔ مجھے امید ہے کہ یہ مضمون قارئین کے لیے مفید تھا۔ اگر آپ کے کوئی سوالات ہیں، تو تبصرے میں ان سے پوچھیں، مجھے جواب دینے میں خوشی ہوگی :) اس کے علاوہ، مقابلہ میں مصنف کو "لائیک" کرکے اس کی حمایت کرنا نہ بھولیں۔ یا بہتر ابھی تک - "مجھے یہ بہت پسند ہے" :) آپ کی پڑھائی میں اچھی قسمت!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION