JavaRush /جاوا بلاگ /Random-UR /JPA: ٹیکنالوجی کا تعارف
Viacheslav
سطح

JPA: ٹیکنالوجی کا تعارف

گروپ میں شائع ہوا۔
جدید ترقی کی دنیا زندگی کو آسان بنانے کے لیے ڈیزائن کی گئی مختلف خصوصیات سے بھری ہوئی ہے۔ ٹولز کو جان کر، آپ صحیح کا انتخاب کر سکتے ہیں۔ جانے بغیر، آپ اپنی زندگی کو مزید مشکل بنا سکتے ہیں۔ یہ جائزہ JPA - Java Persistence API کے تصور پر رازداری کا پردہ اٹھا دے گا۔ مجھے امید ہے کہ پڑھنے کے بعد آپ اس پراسرار دنیا میں مزید گہرائی میں جانا چاہیں گے۔
JPA: ٹیکنالوجی کا تعارف - 1

تعارف

جیسا کہ ہم جانتے ہیں، پروگراموں کے اہم کاموں میں سے ایک ڈیٹا کو اسٹور کرنا اور پروسیس کرنا ہے۔ اچھے پرانے دنوں میں، لوگ صرف فائلوں میں ڈیٹا محفوظ کرتے تھے۔ لیکن جیسے ہی بیک وقت پڑھنے اور ترمیم کی رسائی کی ضرورت ہوتی ہے، جب ایک بوجھ ہوتا ہے (یعنی ایک ہی وقت میں کئی درخواستیں آتی ہیں)، ڈیٹا کو محض فائلوں میں محفوظ کرنا ایک مسئلہ بن جاتا ہے۔ اس بارے میں مزید معلومات کے لیے کہ ڈیٹا بیس کن مسائل کو حل کرتے ہیں اور کیسے، میں آپ کو مضمون پڑھنے کا مشورہ دیتا ہوں " ڈیٹا بیسز کی ساخت کیسے بنتی ہے ۔" اس کا مطلب ہے کہ ہم اپنے ڈیٹا کو ڈیٹا بیس میں محفوظ کرنے کا فیصلہ کرتے ہیں۔ ایک طویل عرصے سے، جاوا JDBC API (The Java Database Connectivity) کا استعمال کرتے ہوئے ڈیٹا بیس کے ساتھ کام کرنے میں کامیاب رہا ہے۔ آپ JDBC کے بارے میں مزید یہاں پڑھ سکتے ہیں: " JDBC یا یہ سب کہاں سے شروع ہوتا ہے ۔" لیکن وقت گزرتا گیا اور ڈیولپرز کو ہر بار ڈیٹا بیس میں جاوا آبجیکٹ کو محفوظ کرنے کے معمولی کاموں کے لیے ایک ہی قسم کا اور غیر ضروری "مینٹیننس" کوڈ (نام نہاد بوائلر پلیٹ کوڈ) لکھنے کی ضرورت کا سامنا کرنا پڑا اور اس کے برعکس جاوا آبجیکٹ کو ڈیٹا بیس میں استعمال کرتے ہوئے ڈیٹا بیس اور پھر، ان مسائل کو حل کرنے کے لیے، ORM جیسے تصور نے جنم لیا۔ ORM - آبجیکٹ-ریلیشنل میپنگ یا روسی آبجیکٹ-ریلیشنل میپنگ میں ترجمہ کیا گیا ہے۔ یہ ایک پروگرامنگ ٹیکنالوجی ہے جو ڈیٹا بیس کو آبجیکٹ پر مبنی پروگرامنگ زبانوں کے تصورات سے جوڑتی ہے۔ آسان بنانے کے لیے، ORM جاوا آبجیکٹ اور ڈیٹا بیس میں ریکارڈ کے درمیان تعلق ہے: JPA: ٹیکنالوجی کا تعارف - 2ORM بنیادی طور پر یہ تصور ہے کہ جاوا آبجیکٹ کو ڈیٹا بیس میں ڈیٹا کے طور پر پیش کیا جا سکتا ہے (اور اس کے برعکس)۔ یہ JPA تفصیلات - Java Persistence API کی شکل میں مجسم تھا۔ تفصیلات پہلے ہی جاوا API کی وضاحت ہے جو اس تصور کو ظاہر کرتی ہے۔ تصریح ہمیں بتاتی ہے کہ ORM تصور کے مطابق کام کرنے کے لیے ہمیں کون سے ٹولز فراہم کیے جائیں (یعنی ہم کن انٹرفیسز کے ذریعے کام کر سکتے ہیں)۔ اور ان فنڈز کو کیسے استعمال کیا جائے۔ تفصیلات ٹولز کے نفاذ کی وضاحت نہیں کرتی ہیں۔ یہ ایک تصریح کے لیے مختلف نفاذ کو استعمال کرنا ممکن بناتا ہے۔ آپ اسے آسان بنا سکتے ہیں اور کہہ سکتے ہیں کہ تصریح API کی تفصیل ہے۔ JPA تفصیلات کا متن اوریکل ویب سائٹ پر پایا جا سکتا ہے: " JSR 338: JavaTM Persistence API "۔ لہذا، JPA استعمال کرنے کے لیے، ہمیں کچھ نفاذ کی ضرورت ہے جس کے ساتھ ہم ٹیکنالوجی کا استعمال کریں گے۔ JPA کے نفاذ کو JPA فراہم کرنے والے بھی کہا جاتا ہے۔ سب سے زیادہ قابل ذکر JPA نفاذ میں سے ایک Hibernate ہے ۔ لہذا، میں اس پر غور کرنے کی تجویز کرتا ہوں۔
JPA: ٹیکنالوجی کا تعارف - 3

ایک پروجیکٹ بنانا

چونکہ JPA جاوا کے بارے میں ہے، ہمیں جاوا پروجیکٹ کی ضرورت ہوگی۔ ہم خود ڈائرکٹری کا ڈھانچہ خود بنا سکتے ہیں اور خود ضروری لائبریریوں کو شامل کر سکتے ہیں۔ لیکن پراجیکٹس کی اسمبلی کو خودکار بنانے کے لیے سسٹمز کا استعمال کرنا زیادہ آسان اور درست ہے (یعنی، جوہر میں، یہ صرف ایک پروگرام ہے جو ہمارے لیے پراجیکٹس کی اسمبلی کا انتظام کرے گا۔ ڈائریکٹریز بنائیں، کلاس پاتھ میں ضروری لائبریریاں شامل کریں، وغیرہ۔ .) ایسا ہی ایک نظام Gradle ہے۔ آپ یہاں گریڈل کے بارے میں مزید پڑھ سکتے ہیں: " گریڈل کا مختصر تعارف "۔ جیسا کہ ہم جانتے ہیں، گریڈل کی فعالیت (یعنی وہ چیزیں جو یہ کر سکتی ہیں) کو مختلف گریڈل پلگ انز کا استعمال کرتے ہوئے لاگو کیا جاتا ہے۔ آئیے Gradle اور " Gradle Build Init Plugin " پلگ ان استعمال کریں۔ آئیے کمانڈ چلائیں:

gradle init --type java-application
گریڈل ہمارے لیے ضروری ڈائرکٹری کا ڈھانچہ کرے گا اور بلڈ اسکرپٹ میں پروجیکٹ کی بنیادی وضاحتی وضاحت بنائے گا build.gradle۔ تو، ہمارے پاس ایک درخواست ہے۔ ہمیں اس کے بارے میں سوچنے کی ضرورت ہے کہ ہم اپنی درخواست کے ساتھ کیا بیان کرنا یا ماڈل کرنا چاہتے ہیں۔ آئیے کچھ ماڈلنگ ٹول استعمال کریں، مثال کے طور پر: app.quickdatabasediagrams.com JPA: ٹیکنالوجی کا تعارف - 4 یہاں یہ کہنا ضروری ہے کہ ہم نے جو بیان کیا ہے وہ ہمارا "ڈومین ماڈل" ہے۔ ڈومین ایک "سبجیکٹ ایریا" ہے۔ عام طور پر، ڈومین لاطینی میں "قبضہ" ہے۔ قرون وسطی میں، یہ نام بادشاہوں یا جاگیرداروں کی ملکیت والے علاقوں کو دیا جاتا تھا۔ اور فرانسیسی میں یہ لفظ "ڈومین" بن گیا، جس کا ترجمہ صرف "علاقہ" ہے۔ اس طرح ہم نے اپنا "ڈومین ماڈل" = "سبجیکٹ ماڈل" بیان کیا۔ اس ماڈل کا ہر عنصر کسی نہ کسی قسم کا "جوہر" ہے، حقیقی زندگی سے کچھ۔ ہمارے معاملے میں، یہ ادارے ہیں: زمرہ ( Category)، موضوع ( Topic)۔ آئیے اداروں کے لیے ایک علیحدہ پیکج بنائیں، مثال کے طور پر نام کے ماڈل کے ساتھ۔ اور آئیے وہاں جاوا کلاسز شامل کریں جو ہستیوں کو بیان کرتی ہیں۔ جاوا کوڈ میں، اس طرح کے ادارے ایک باقاعدہ POJO ہیں ، جو اس طرح نظر آسکتے ہیں:
public class Category {
    private Long id;
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
آئیے کلاس کے مواد کو کاپی کریں اور تشبیہ کے مطابق کلاس بنائیں Topic۔ وہ صرف اس میں اختلاف کرے گا جو وہ جانتا ہے کہ وہ کس زمرے سے تعلق رکھتا ہے۔ لہذا، آئیے Topicکلاس میں ایک زمرہ فیلڈ اور اس کے ساتھ کام کرنے کے طریقے شامل کریں:
private Category category;

public Category getCategory() {
	return category;
}

public void setCategory(Category category) {
	this.category = category;
}
اب ہمارے پاس جاوا ایپلی کیشن ہے جس کا اپنا ڈومین ماڈل ہے۔ اب وقت آگیا ہے کہ جے پی اے پروجیکٹ سے جڑنا شروع کیا جائے۔
JPA: ٹیکنالوجی کا تعارف - 5

JPA شامل کرنا

لہذا، جیسا کہ ہمیں یاد ہے، JPA کا مطلب ہے کہ ہم ڈیٹا بیس میں کچھ محفوظ کریں گے۔ لہذا، ہمیں ایک ڈیٹا بیس کی ضرورت ہے. ہمارے پروجیکٹ میں ڈیٹا بیس کنکشن استعمال کرنے کے لیے، ہمیں ڈیٹابیس سے منسلک ہونے کے لیے انحصاری لائبریری شامل کرنے کی ضرورت ہے۔ جیسا کہ ہمیں یاد ہے، ہم نے گریڈل کا استعمال کیا، جس نے ہمارے لیے ایک تعمیراتی اسکرپٹ بنایا build.gradle۔ اس میں ہم ان انحصارات کو بیان کریں گے جن کی ہمارے پروجیکٹ کی ضرورت ہے۔ انحصار وہ لائبریریاں ہیں جن کے بغیر ہمارا کوڈ کام نہیں کر سکتا۔ آئیے ڈیٹا بیس سے منسلک ہونے پر انحصار کی وضاحت کے ساتھ شروع کرتے ہیں۔ ہم یہ اسی طرح کرتے ہیں اگر ہم صرف JDBC کے ساتھ کام کر رہے ہوتے تو ہم یہ کرتے:

dependencies {
	implementation 'com.h2database:h2:1.4.199'
اب ہمارے پاس ایک ڈیٹا بیس ہے۔ اب ہم اپنی ایپلیکیشن میں ایک پرت شامل کر سکتے ہیں جو ہمارے جاوا آبجیکٹ کو ڈیٹا بیس کے تصورات (جاوا سے SQL تک) میں نقشہ سازی کے لیے ذمہ دار ہے۔ جیسا کہ ہمیں یاد ہے، ہم اس کے لیے ہائبرنیٹ نامی JPA تفصیلات کے نفاذ کا استعمال کرنے جا رہے ہیں:

dependencies {
	implementation 'com.h2database:h2:1.4.199'
	implementation 'org.hibernate:hibernate-core:5.4.2.Final'
اب ہمیں JPA ترتیب دینے کی ضرورت ہے۔ اگر ہم تصریح اور سیکشن "8.1 Persistence Unit" کو پڑھیں، تو ہمیں معلوم ہو جائے گا کہ Persistence Unit کسی قسم کی ترتیب، میٹا ڈیٹا اور اداروں کا مجموعہ ہے۔ اور JPA کے کام کرنے کے لیے، آپ کو کنفیگریشن فائل میں کم از کم ایک Persistence Unit کو بیان کرنا ہوگا، جسے کہا جاتا ہے persistence.xml۔ اس کا مقام تفصیلات کے باب "8.2 پرسسٹینس یونٹ پیکیجنگ" میں بیان کیا گیا ہے۔ اس سیکشن کے مطابق، اگر ہمارے پاس جاوا SE ماحول ہے، تو ہمیں اسے META-INF ڈائریکٹری کے روٹ میں رکھنا چاہیے۔
JPA: ٹیکنالوجی کا تعارف - 6
آئیے " 8.2.1 persistence.xml file" باب میں JPA تفصیلات میں دی گئی مثال سے مواد کو نقل کرتے ہیں:
<persistence>
	<persistence-unit name="JavaRush">
        <description>Persistence Unit For test</description>
        <class>hibernate.model.Category</class>
        <class>hibernate.model.Topic</class>
    </persistence-unit>
</persistence>
لیکن یہ کافی نہیں ہے۔ ہمیں یہ بتانے کی ضرورت ہے کہ ہمارا JPA فراہم کنندہ کون ہے، یعنی وہ جو جے پی اے تفصیلات کو نافذ کرتا ہے:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
اب ترتیبات شامل کریں ( properties)۔ ان میں سے کچھ (کے ساتھ شروع ہونے والے javax.persistence) معیاری JPA کنفیگریشنز ہیں اور JPA تفصیلات میں سیکشن "8.2.1.9 پراپرٹیز" میں بیان کی گئی ہیں۔ کچھ کنفیگریشنز فراہم کنندہ کے لیے مخصوص ہیں (ہمارے معاملے میں، وہ ہائیبرنیٹ کو Jpa فراہم کنندہ کے طور پر متاثر کرتی ہیں۔ ہمارا سیٹنگز بلاک اس طرح نظر آئے گا:
<properties>
    <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE" />
    <property name="javax.persistence.jdbc.user" value="sa" />
    <property name="javax.persistence.jdbc.password" value="" />
    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
اب ہمارے پاس ایک JPA-compatible config ہے persistence.xml، ایک JPA فراہم کنندہ Hibernate ہے اور ایک H2 ڈیٹا بیس ہے، اور 2 کلاسیں بھی ہیں جو ہمارے ڈومین ماڈل ہیں۔ چلو آخر کار یہ سب کام کرتے ہیں۔ کیٹلاگ میں /test/java، ہمارے گریڈل نے مہربانی سے یونٹ ٹیسٹ کے لیے ایک ٹیمپلیٹ تیار کیا اور اسے AppTest کہا۔ آئیے اسے استعمال کریں۔ جیسا کہ JPA تفصیلات کے "7.1 Persistence Contexts" باب میں بیان کیا گیا ہے، JPA دنیا میں ادارے ایک جگہ میں رہتے ہیں جسے Persistence Contexts کہا جاتا ہے۔ لیکن ہم مستقل سیاق و سباق کے ساتھ براہ راست کام نہیں کرتے ہیں۔ اس کے لیے ہم Entity Managerیا "اینٹی مینیجر" کا استعمال کرتے ہیں۔ یہ وہی ہے جو سیاق و سباق کے بارے میں جانتا ہے اور وہاں کون سے ادارے رہتے ہیں۔ ہم Entity Manager'اوم' کے ساتھ بات چیت کرتے ہیں۔ پھر بس یہ سمجھنا باقی ہے کہ ہم یہ کہاں سے حاصل کر سکتے ہیں Entity Manager؟ JPA تفصیلات کے باب "7.2.2 ایک ایپلیکیشن کے زیر انتظام ہستی مینیجر کا حصول" کے مطابق، ہمیں استعمال کرنا چاہیے EntityManagerFactory۔ لہذا، آئیے خود کو JPA تفصیلات کے ساتھ تیار کریں اور باب "7.3.2 جاوا SE ماحولیات میں ایک ہستی مینیجر فیکٹری حاصل کرنا" سے ایک مثال لیں اور اسے ایک سادہ یونٹ ٹیسٹ کی شکل میں فارمیٹ کریں:
@Test
public void shouldStartHibernate() {
	EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
	EntityManager entityManager = emf.createEntityManager();
}
یہ ٹیسٹ پہلے سے ہی "Unrecognized JPA persistence.xml XSD ورژن" کی غلطی دکھائے گا۔ وجہ یہ ہے کہ persistence.xmlآپ کو استعمال کرنے کے لیے اسکیما کو درست طریقے سے بیان کرنے کی ضرورت ہے، جیسا کہ سیکشن "8.3 persistence.xml Schema" میں JPA تفصیلات میں بتایا گیا ہے:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
             version="2.2">
اس کے علاوہ، عناصر کی ترتیب اہم ہے. لہذا، providerکلاسوں کی فہرست سے پہلے اس کی وضاحت ضروری ہے۔ اس کے بعد یہ ٹیسٹ کامیابی سے چلے گا۔ ہم نے براہ راست JPA کنکشن مکمل کر لیا ہے۔ اس سے پہلے کہ ہم آگے بڑھیں، آئیے باقی ٹیسٹوں کے بارے میں سوچیں۔ ہمارے ہر ٹیسٹ کی ضرورت ہوگی EntityManager۔ آئیے اس بات کو یقینی بنائیں کہ EntityManagerعمل درآمد کے آغاز میں ہر ٹیسٹ کا اپنا ہوتا ہے۔ اس کے علاوہ، ہم چاہتے ہیں کہ ڈیٹا بیس ہر بار نیا ہو۔ اس حقیقت کی وجہ سے کہ ہم inmemoryآپشن کا استعمال کرتے ہیں، یہ بند کرنا کافی ہے EntityManagerFactory۔ تخلیق Factoryایک مہنگا آپریشن ہے۔ لیکن ٹیسٹ کے لیے یہ جائز ہے۔ JUnit آپ کو ان طریقوں کی وضاحت کرنے کی اجازت دیتا ہے جو ہر ٹیسٹ کے عمل سے پہلے (پہلے) اور (بعد) کے بعد انجام دیے جائیں گے:
public class AppTest {
    private EntityManager em;

    @Before
    public void init() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
        em = emf.createEntityManager();
    }

    @After
    public void close() {
        em.getEntityManagerFactory().close();
        em.close();
    }
اب، کسی بھی ٹیسٹ کو انجام دینے سے پہلے، ایک نیا بنایا جائے گا EntityManagerFactory، جس میں ایک نیا ڈیٹا بیس بنانا ہوگا، کیونکہ hibernate.hbm2ddl.autoمعنی رکھتا createہے اور نئی فیکٹری سے ہمیں ایک نیا ملے گا EntityManager۔
JPA: ٹیکنالوجی کا تعارف - 7

اداروں

جیسا کہ ہمیں یاد ہے، ہم نے پہلے ایسی کلاسیں بنائیں جو ہمارے ڈومین ماڈل کو بیان کرتی ہیں۔ ہم پہلے ہی کہہ چکے ہیں کہ یہ ہمارے "جوہر" ہیں۔ یہ وہ ہستی ہے جسے ہم استعمال کرتے ہوئے منظم کریں گے EntityManager۔ آئیے زمرہ کے جوہر کو بچانے کے لیے ایک سادہ ٹیسٹ لکھتے ہیں:
@Test
public void shouldPersistCategory() {
	Category cat = new Category();
	cat.setTitle("new category");
	// JUnit обеспечит тест свежим EntityManager'ом
	em.persist(cat);
}
لیکن یہ ٹیسٹ فوری طور پر کام نہیں کرے گا، کیونکہ... ہمیں مختلف غلطیاں موصول ہوں گی جو ہمیں یہ سمجھنے میں مدد کریں گی کہ ادارے کیا ہیں:
  • Unknown entity: hibernate.model.Category
    ہائبرنیٹ کیوں نہیں سمجھتا کہ Categoryیہ کیا ہے entity؟ بات یہ ہے کہ اداروں کو JPA کے معیار کے مطابق بیان کیا جانا چاہیے۔
    ہستی کی کلاسوں کو تشریح کے ساتھ تشریح کرنا ضروری ہے @Entity، جیسا کہ JPA تفصیلات کے باب "2.1 The Entity Class" میں بتایا گیا ہے۔

  • No identifier specified for entity: hibernate.model.Category
    اداروں کے پاس ایک منفرد شناخت کنندہ ہونا ضروری ہے جو ایک ریکارڈ کو دوسرے سے ممتاز کرنے کے لیے استعمال کیا جا سکتا ہے۔
    JPA تفصیلات کے باب "2.4 بنیادی کلیدیں اور ہستی کی شناخت" کے مطابق، "ہر ادارے کے پاس ایک بنیادی کلید ہونی چاہیے"، یعنی ہر ادارے کے پاس ایک "بنیادی کلید" ہونی چاہیے۔ ایسی بنیادی کلید کو تشریح کے ذریعہ متعین کیا جانا چاہیے۔@Id

  • ids for this class must be manually assigned before calling save()
    آئی ڈی کہیں سے آنی ہے۔ یہ دستی طور پر بیان کیا جا سکتا ہے، یا یہ خود کار طریقے سے حاصل کیا جا سکتا ہے.
    لہذا، جیسا کہ ابواب "11.2.3.3 جنریٹڈ ویلیو" اور "11.1.20 جنریٹڈ ویلیو اینوٹیشن" میں اشارہ کیا گیا ہے، ہم تشریح کی وضاحت کر سکتے ہیں @GeneratedValue۔

لہذا زمرہ کی کلاس کو ایک ہستی بننے کے لیے ہمیں درج ذیل تبدیلیاں کرنی ہوں گی۔
@Entity
public class Category {
    @Id
    @GeneratedValue
    private Long id;
اس کے علاوہ، تشریح @Idاشارہ کرتی ہے کہ کون سا استعمال کرنا ہے Access Type۔ آپ JPA تفصیلات میں رسائی کی قسم کے بارے میں مزید پڑھ سکتے ہیں، سیکشن "2.3 رسائی کی قسم" میں۔ اسے مختصراً کہوں، کیونکہ... ہم نے @Idفیلڈ ( field) کے اوپر بیان کیا ہے، پھر رسائی کی قسم ڈیفالٹ ہوگی field-based، نہیں property-based۔ لہذا، JPA فراہم کنندہ اقدار کو براہ راست فیلڈز سے پڑھے گا اور اسٹور کرے گا۔ اگر ہم @Idگیٹر کے اوپر رکھتے ہیں، تو property-basedرسائی استعمال کی جائے گی، یعنی گیٹر اور سیٹر کے ذریعے۔ ٹیسٹ چلاتے وقت، ہم یہ بھی دیکھتے ہیں کہ ڈیٹا بیس کو کیا درخواستیں بھیجی جاتی ہیں (آپشن کا شکریہ hibernate.show_sql)۔ لیکن بچت کرتے وقت ہمیں کوئی نظر نہیں آتا insert۔ یہ پتہ چلتا ہے کہ ہم نے اصل میں کچھ بھی نہیں بچایا؟ JPA آپ کو طریقہ استعمال کرتے ہوئے استقامت کے سیاق و سباق اور ڈیٹا بیس کو ہم آہنگ کرنے کی اجازت دیتا ہے flush:
entityManager.flush();
لیکن اگر ہم ابھی اس پر عمل کرتے ہیں تو ہمیں ایک خرابی ملے گی: کوئی لین دین جاری نہیں ہے ۔ اور اب یہ جاننے کا وقت ہے کہ JPA کس طرح لین دین کو استعمال کرتا ہے۔
JPA: ٹیکنالوجی کا تعارف - 8

جے پی اے ٹرانزیکشنز

جیسا کہ ہمیں یاد ہے، JPA استقامت کے سیاق و سباق کے تصور پر مبنی ہے۔ یہ وہ جگہ ہے جہاں ادارے رہتے ہیں۔ اور ہم اداروں کے ذریعے انتظام کرتے ہیں EntityManager۔ جب ہم کمانڈ پر عمل کرتے ہیں persistتو ہم ہستی کو سیاق و سباق میں رکھتے ہیں۔ مزید واضح طور پر، ہم بتاتے ہیں EntityManagerکہ ایسا کرنے کی ضرورت ہے۔ لیکن یہ سیاق و سباق صرف کچھ اسٹوریج ایریا ہے۔ اسے کبھی کبھی "پہلے درجے کی کیش" بھی کہا جاتا ہے۔ لیکن اسے ڈیٹا بیس سے منسلک کرنے کی ضرورت ہے۔ کمانڈ flush، جو پہلے غلطی کے ساتھ ناکام ہوئی تھی، ڈیٹا بیس کے ساتھ استقامت کے سیاق و سباق سے ڈیٹا کو ہم آہنگ کرتی ہے۔ لیکن اس کے لیے ٹرانسپورٹ کی ضرورت ہوتی ہے اور یہ ٹرانسپورٹ ایک لین دین ہے۔ JPA میں ٹرانزیکشنز کو تفصیلات کے "7.5 کنٹرولنگ ٹرانزیکشنز" سیکشن میں بیان کیا گیا ہے۔ JPA میں لین دین کے استعمال کے لیے ایک خصوصی API ہے:
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
ہمیں اپنے کوڈ میں ٹرانزیکشن مینجمنٹ شامل کرنے کی ضرورت ہے، جو ٹیسٹ سے پہلے اور بعد میں چلتا ہے:
@Before
public void init() {
	EntityManagerFactory emf = Persistence.createEntityManagerFactory( "JavaRush" );
	em = emf.createEntityManager();
	em.getTransaction().begin();
}
@After
public void close() {
	if (em.getTransaction().isActive()) {
		em.getTransaction().commit();
        }
	em.getEntityManagerFactory().close();
	em.close();
}
شامل کرنے کے بعد، ہم داخل لاگ میں SQL میں ایک اظہار دیکھیں گے جو پہلے نہیں تھا:
JPA: ٹیکنالوجی کا تعارف - 9
EntityManagerلین دین میں جمع ہونے والی تبدیلیاں ڈیٹا بیس میں ارتکاب (تصدیق شدہ اور محفوظ) کی گئیں۔ آئیے اب اپنا جوہر تلاش کرنے کی کوشش کرتے ہیں۔ آئیے کسی ہستی کو اس کی ID کے ذریعے تلاش کرنے کے لیے ایک ٹیسٹ بنائیں:
@Test
public void shouldFindCategory() {
	Category cat = new Category();
	cat.setTitle("test");
	em.persist(cat);
	Category result = em.find(Category.class, 1L);
	assertNotNull(result);
}
اس صورت میں، ہمیں وہ ہستی موصول ہوگی جسے ہم نے پہلے محفوظ کیا تھا، لیکن ہم لاگ میں SELECT سوالات نہیں دیکھیں گے۔ اور سب کچھ اس بات پر مبنی ہے جو ہم کہتے ہیں: "اینٹیٹی مینیجر، براہ کرم مجھے ID=1 کے ساتھ زمرہ کی ہستی تلاش کریں۔" اور ہستی کا مینیجر سب سے پہلے اپنے سیاق و سباق میں دیکھتا ہے (ایک قسم کا کیش استعمال کرتا ہے)، اور صرف اس صورت میں جب اسے نہیں ملتا، یہ ڈیٹا بیس میں دیکھنے کے لیے جاتا ہے۔ یہ ID کو 2 میں تبدیل کرنے کے قابل ہے (ایسی کوئی چیز نہیں ہے، ہم نے صرف 1 مثال محفوظ کی ہے) اور ہم دیکھیں گے کہ SELECTدرخواست ظاہر ہوتی ہے۔ کیونکہ سیاق و سباق میں کوئی ہستی نہیں ملی اور EntityManagerڈیٹابیس کسی ہستی کو تلاش کرنے کی کوشش کر رہا ہے۔ مختلف کمانڈز ہیں جنہیں ہم سیاق و سباق میں کسی ہستی کی حالت کو کنٹرول کرنے کے لیے استعمال کر سکتے ہیں۔ کسی ہستی کی ایک حالت سے دوسری حالت میں منتقلی کو ہستی کا لائف سائیکل کہا جاتا ہے lifecycle۔
JPA: ٹیکنالوجی کا تعارف - 10

ہستی لائف سائیکل

ہستیوں کے لائف سائیکل کو JPA تفصیلات میں باب "3.2 Entity Instance's Life Cycle" میں بیان کیا گیا ہے۔ کیونکہ ادارے ایک سیاق و سباق میں رہتے ہیں اور ان کے ذریعے کنٹرول کیا جاتا ہے EntityManager، پھر وہ کہتے ہیں کہ اداروں کو کنٹرول کیا جاتا ہے، یعنی منظم آئیے ایک ہستی کی زندگی کے مراحل کو دیکھتے ہیں:
// 1. New or Transient (временный)
Category cat = new Category();
cat.setTitle("new category");
// 2. Managed or Persistent
entityManager.persist(cat);
// 3. Транзакция завершена, все сущности в контексте detached
entityManager.getTransaction().begin();
entityManager.getTransaction().commit();
// 4. Сущность изымаем из контекста, она становится detached
entityManager.detach(cat);
// 5. Сущность из detached можно снова сделать managed
Category managed = entityManager.merge(cat);
// 6. И можно сделать Removed. Интересно, что cat всё равно detached
entityManager.remove(managed);
اور اسے مضبوط کرنے کے لیے یہاں ایک خاکہ ہے:
JPA: ٹیکنالوجی کا تعارف - 11
JPA: ٹیکنالوجی کا تعارف - 12

نقشہ سازی

جے پی اے میں ہم ایک دوسرے کے درمیان اداروں کے تعلقات کو بیان کر سکتے ہیں۔ آئیے یاد رکھیں کہ جب ہم اپنے ڈومین ماڈل سے نمٹتے تھے تو ہم نے پہلے ہی ایک دوسرے کے درمیان اداروں کے تعلقات کو دیکھا تھا۔ پھر ہم نے quickdatabasediagrams.com کا وسیلہ استعمال کیا :
JPA: ٹیکنالوجی کا تعارف - 13
اداروں کے درمیان روابط قائم کرنا میپنگ یا ایسوسی ایشن (ایسوسی ایشن میپنگز) کہلاتا ہے۔ انجمنوں کی وہ اقسام جو JPA کا استعمال کرتے ہوئے قائم کی جا سکتی ہیں ذیل میں پیش کی گئی ہیں۔
JPA: ٹیکنالوجی کا تعارف - 14
آئیے ایک ایسی ہستی کو دیکھتے ہیں Topicجو کسی موضوع کو بیان کرتی ہے۔ Topicکی طرف رویہ کے بارے میں ہم کیا کہہ سکتے ہیں Category؟ کئی Topicایک طبقے سے تعلق رکھتے ہوں گے۔ اس لیے ہمیں ایک انجمن کی ضرورت ہے ManyToOne۔ آئیے جے پی اے میں اس تعلق کا اظہار کریں:
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
یہ یاد رکھنے کے لیے کہ کون سی تشریحات ڈالنی ہیں، آپ یاد رکھ سکتے ہیں کہ آخری حصہ اس فیلڈ کے لیے ذمہ دار ہے جس کے اوپر تشریح کی نشاندہی کی گئی ہے۔ ToOne- مخصوص مثال. ToMany--.مجموعہ اب ہمارا تعلق یک طرفہ ہے۔ آئیے اسے دو طرفہ مواصلات بنائیں۔ آئیے اس زمرے میں شامل Categoryہر ایک کے بارے میں معلومات میں اضافہ کریں۔ Topicیہ کے ساتھ ختم ہونا چاہیے ToMany، کیونکہ ہمارے پاس ایک فہرست ہے Topic۔ یہ ہے، رویہ "بہت سے" موضوعات. سوال باقی ہے - OneToManyیا ManyToMany:
JPA: ٹیکنالوجی کا تعارف - 15
اسی موضوع پر ایک اچھا جواب یہاں پڑھا جا سکتا ہے: " ORM oneToMany، manyToMany رشتہ کی وضاحت کریں جیسے میں پانچ ہوں "۔ اگر کسی زمرے کا عنوانات سے کوئی تعلق ہے ToMany، تو ان میں سے ہر ایک عنوان کا صرف ایک زمرہ ہو سکتا ہے، پھر یہ ہو گا One، ورنہ Many۔ اس طرح، Categoryتمام موضوعات کی فہرست اس طرح نظر آئے گی:
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "topic_id")
private Set<Topic> topics = new HashSet<>();
اور آئیے Categoryتمام عنوانات کی فہرست حاصل کرنے کے لیے بنیادی طور پر ایک گیٹر لکھنا نہ بھولیں:
public Set<Topic> getTopics() {
	return this.topics;
}
دو طرفہ تعلقات خود بخود ٹریک کرنا ایک بہت مشکل چیز ہے۔ لہذا، JPA اس ذمہ داری کو ڈویلپر پر منتقل کرتا ہے۔ ہمارے لیے اس کا مطلب یہ ہے کہ جب ہم ہستی Topicکے ساتھ تعلق قائم کرتے ہیں Category، تو ہمیں خود ڈیٹا کی مطابقت کو یقینی بنانا چاہیے۔ یہ آسانی سے کیا جاتا ہے:
public void setCategory(Category category) {
	category.getTopics().add(this);
	this.category = category;
}
آئیے چیک کرنے کے لیے ایک سادہ ٹیسٹ لکھتے ہیں:
@Test
public void shouldPersistCategoryAndTopics() {
	Category cat = new Category();
	cat.setTitle("test");
	Topic topic = new Topic();
	topic.setTitle("topic");
	topic.setCategory(cat);
 	em.persist(cat);
}
نقشہ سازی ایک مکمل علیحدہ موضوع ہے۔ اس جائزے کا مقصد ان ذرائع کو سمجھنا ہے جن کے ذریعے یہ حاصل کیا جاتا ہے۔ آپ یہاں نقشہ سازی کے بارے میں مزید پڑھ سکتے ہیں:
JPA: ٹیکنالوجی کا تعارف - 16

جے پی کیو ایل

جے پی اے نے ایک دلچسپ ٹول متعارف کرایا ہے - جاوا پرسسٹینس کوئری لینگویج میں سوالات۔ یہ زبان ایس کیو ایل کی طرح ہے، لیکن ایس کیو ایل ٹیبلز کے بجائے جاوا آبجیکٹ ماڈل استعمال کرتی ہے۔ آئیے ایک مثال دیکھتے ہیں:
@Test
public void shouldPerformQuery() {
	Category cat = new Category();
	cat.setTitle("query");
	em.persist(cat);
	Query query = em.createQuery("SELECT c from Category c WHERE c.title = 'query'");
 	assertNotNull(query.getSingleResult());
}
جیسا کہ ہم دیکھ سکتے ہیں، استفسار میں ہم نے ایک ہستی کا حوالہ استعمال کیا Categoryنہ کہ ٹیبل۔ اور اس ہستی کے میدان میں بھی title۔ JPQL بہت سی مفید خصوصیات فراہم کرتا ہے اور اپنے مضمون کا مستحق ہے۔ مزید تفصیلات جائزے میں مل سکتی ہیں:
JPA: ٹیکنالوجی کا تعارف - 17

معیار API

اور آخر میں، میں Criteria API کو چھونا چاہوں گا۔ JPA نے ایک متحرک استفسار سازی کا آلہ متعارف کرایا ہے۔ معیار API استعمال کرنے کی مثال:
@Test
public void shouldFindWithCriteriaAPI() {
	Category cat = new Category();
	em.persist(cat);
	CriteriaBuilder cb = em.getCriteriaBuilder();
	CriteriaQuery<Category> query = cb.createQuery(Category.class);
	Root<Category> c = query.from(Category.class);
	query.select(c);
	List<Category> resultList = em.createQuery(query).getResultList();
	assertEquals(1, resultList.size());
}
یہ مثال درخواست پر عمل درآمد کرنے کے مترادف ہے SELECT c FROM Category c۔ Criteria API ایک طاقتور ٹول ہے۔ آپ یہاں اس کے بارے میں مزید پڑھ سکتے ہیں:

نتیجہ

جیسا کہ ہم دیکھ سکتے ہیں، JPA بہت بڑی تعداد میں خصوصیات اور ٹولز فراہم کرتا ہے۔ ان میں سے ہر ایک کو تجربہ اور علم کی ضرورت ہوتی ہے۔ جے پی اے کے جائزے کے فریم ورک کے اندر بھی، ہر چیز کا تذکرہ کرنا ممکن نہیں تھا، تفصیلی غوطہ لگانے کا ذکر نہ کرنا۔ لیکن مجھے امید ہے کہ اسے پڑھنے کے بعد، یہ واضح ہو گیا کہ ORM اور JPA کیا ہیں، وہ کیسے کام کرتے ہیں اور اس کے ساتھ کیا کیا جا سکتا ہے۔ ٹھیک ہے، ایک ناشتے کے لئے میں مختلف مواد پیش کرتا ہوں: #ویاچسلاو
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION