یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی
🎯 ثبت نام

درس 23 : آموزش آدرس دهی One to Many در Hibernate با List

آموزش آدرس دهی mapping One to Many در Hibernate با استفاده از List :

اگر کلاس Persistent Class شما شامل اشیای لیست دار list object ای باشد که خود حاوی رفرنس های entity است، بایستی از روش آدرس دهی One to Many mapping برای آدرس دهی یا map کردن المنت های list استفاده کنیم. ما می توانیم این شی لیست (list object) را با استفاده از المنت list یا bag آدرس دهی کنیم.

نکته:

توجه داشته باشید که المنت bag ایندکس شده نیست (no indexed-based)، در حالی که المنت list ایندکس شده است.

در این درس هم مانند درس های از قبل، از سناریوی انجمن برای تشریح مثال خود استفاده می کنیم که در آن هر سوال می تواند چندین جواب داشته باشد. شکل زیر دیاگرام کارکرد این مثال را نشان می دهد :

 آموزش آدرس دهی One to Many در Hibernate با List

بیایید در کد زیر نگاهی به کلاس Persistent Class که حاوی اشیای لیست دار (list objects) بیاندازیم. در چنین موردی، می تواند برای هر سوال question چندین جواب answer وجود داشته باشد و هر answer هم می تواند شامل اطلاعات خود باشد. برای همین دلیل است که ما از hist element های حاوس اشیای Answers برای جایگزینی مجموعه ای از جواب ها استفاده می کنیم.

1
2
3
4
5
6
7
8
9
package com.javatpoint; 
import java.util.List; 
public class Question { 
private int id; 
private String qname; 
private List<answer> answers; 
//getters and setters 
            </answer><button></button>

کلاس Answer Class که کد آن در بخش زیر نشان داده شده است حاوی اطلاعات مختص به خود از جمله id، answername، PostedBy و ... می باشد :

1
2
3
4
5
6
7
8
9
package com.javatpoint; 
public class Answer { 
private int id; 
private String answername; 
private String postedBy; 
//getters and setters 
            <button></button>

کلاس Question Class نیز حاوی اشیای لیست دار list object است که دربرگیرنده رفرنس های entity می باشند، برای مثال Answer Class objects. در چنین مواردی، ما بایستی از روش آدرس دهی one-to-many برای آدرس دهی یا map این شی استفاده کنیم. در کد زیر نحوه آدرس این object آموزش داده شده است :

1
2
3
4
5
<bag name="answers" cascade="all"
          <key column="qid"></key> 
          <one-to-many class="com.javatpoint.Answer"></one-to-many> 
   
            </bag><button></button>

مثال عملی روش آدرس دهی one to many در مجموعه های Hibernate :

در این مثال عملی، روش آدرس دهی list هایی که حاوی رفرنس های entity هستند را به طور کامل آموزش خواهیم داد. برای این منظور مراحل زیر را انجام دهید :

1)کلاس Persistent Class خواص یا Properties لازم جهت کلاس از جمله List را به صورت زیر تعیین می کند :

فایل Question.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.javatpoint; 
   
import java.util.List; 
   
public class Question { 
private int id; 
private String qname; 
private List answers; 
   
//getters and setters 
   
            <button></button>

فایل Answer.java

1
2
3
4
5
6
7
8
9
10
11
package com.javatpoint; 
   
public class Answer { 
private int id; 
private String answername; 
private String postedBy; 
//getters and setters 
   
            <button></button>

2)ایجاد فایل آدرس دهی لازم (mapping file) برای کلاس Persistent :
در این بخش، فایل question.hbm.xml را برای تعیین list به صورت زیر ایجاد می کنیم :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!--?xml version='1.0' encoding='UTF-8'?--> 
   
   
          <hibernate-mapping
          <class name="com.javatpoint.Question" table="q501"
          <id name="id"
          <generator class="increment"></generator
          </id
          <property name="qname"></property
             
          <bag name="answers" cascade="all"
          <index column="type"></index
          <one-to-many class="com.javatpoint.Answer"></one-to-many
          </bag
             
          </class
             
          <class name="com.javatpoint.Answer" table="ans501"
          <id name="id"
          <generator class="increment"></generator
          </id
          <property name="answername"></property
          <property name="postedBy"></property
          </class
             
</hibernate-mapping>
            <button></button>

3)ایجاد فایل پیکربندی اطلاعات Configuration file :
فایل زیر کد فایل Cinfiguration برنامه است، حاوی اطلاعات لازم درباره پایگاه داده و فایل آدرس دهی mapping file می باشد :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--?xml version='1.0' encoding='UTF-8'?--> 
   
   
<!-- Generated by MyEclipse Hibernate Tools.                   --> 
<hibernate-configuration
   
    <session-factory
        <property name="hbm2ddl.auto">update</property
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property
        <property name="connection.username">system</property
        <property name="connection.password">oracle</property
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property
    <mapping resource="question.hbm.xml"></mapping
    </session-factory
   
</hibernate-configuration
            <button></button>

4)ایجاد کلاس لازم برای نگهداری اطلاعات برنامه :
در کلاس زیر به نام StoreData.java کد لازم جهت نگهداری اطلاعات برنامه را تعیین کرده ایم :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.javatpoint; 
   
import java.util.ArrayList; 
   
import org.hibernate.*; 
import org.hibernate.cfg.*; 
   
public class StoreData { 
public static void main(String[] args) { 
    Session session=new Configuration().configure("hibernate.cfg.xml"
                            .buildSessionFactory().openSession(); 
    Transaction t=session.beginTransaction(); 
       
    Answer ans1=new Answer(); 
    ans1.setAnswername("java is a programming language"); 
    ans1.setPostedBy("Ravi Malik"); 
       
    Answer ans2=new Answer(); 
    ans2.setAnswername("java is a platform"); 
    ans2.setPostedBy("Sudhir Kumar"); 
       
    Answer ans3=new Answer(); 
    ans3.setAnswername("Servlet is an Interface"); 
    ans3.setPostedBy("Jai Kumar"); 
       
    Answer ans4=new Answer(); 
    ans4.setAnswername("Servlet is an API"); 
    ans4.setPostedBy("Arun"); 
       
    ArrayList<answer> list1=new ArrayList<answer>(); 
    list1.add(ans1); 
    list1.add(ans2); 
       
    ArrayList<answer> list2=new ArrayList<answer>(); 
    list2.add(ans3); 
    list2.add(ans4); 
       
    Question question1=new Question(); 
    question1.setQname("What is Java?"); 
    question1.setAnswers(list1); 
       
    Question question2=new Question(); 
    question2.setQname("What is Servlet?"); 
    question2.setAnswers(list2); 
       
    session.persist(question1); 
    session.persist(question2); 
       
    t.commit(); 
    session.close(); 
    System.out.println("success"); 
       
 </answer></answer></answer></answer><button></button>

آموزش نحوه دریافت fetch اطلاعات از List :

در این بخش، ما از زبان HQL برای خواندن و دریافت اطلاعات کلاس Question Class از جمله رکوردهای answers پرداخته ایم. در این مثال، دستورات ما اطلاعات را از دو جدول مختلف که به صورت مستقل برنامه ای (functional dependent) با هم در ارتباط هستند، استخراج می کند.
در این کد ما نحوه چاپ خروجی اشیای کلاس answer را تعیین کرده ایم و متد to string() که از کلاس Answer اطلاعات فیلدهای answername و poster name را نادیده می گیریم. بنابراین کد ما مقایسه answer name و postername را در خروجی به جای refrence چاپ می کند.

فایل FetchData.java.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.javatpoint; 
   
import java.util.*; 
   
import org.hibernate.*; 
import org.hibernate.cfg.*; 
   
public class FetchData { 
public static void main(String[] args) { 
       
    Session session=new Configuration().configure("hibernate.cfg.xml"
                          .buildSessionFactory().openSession(); 
       
    Query query=session.createQuery("from Question"); 
    List<question> list=query.list(); 
       
    Iterator<question> itr=list.iterator(); 
    while(itr.hasNext()){ 
        Question q=itr.next(); 
        System.out.println("Question Name: "+q.getQname()); 
           
        //printing answers 
        List<answer> list2=q.getAnswers(); 
        Iterator<answer> itr2=list2.iterator(); 
        while(itr2.hasNext()){ 
            System.out.println(itr2.next()); 
        
           
    
    session.close(); 
    System.out.println("success"); 
       
            </answer></answer></question></question><button></button>
1395/07/11 2171 904
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...