@ManyToOne

उपलब्ध

2.1 टेबल स्तरावर दुवा साधणे

हायबरनेट सहाय्यक सारण्यांमध्ये संग्रह कसे संग्रहित करते ते आपण पाहिले आहे. आता वास्तविक घटक वर्ग संग्रहित करणार्‍या पूर्ण टेबलांमधील संबंध कसे व्यवस्थित करायचे ते शोधूया.

हायबरनेटमधील घटक वर्गांमध्ये चार प्रकारचे संबंध आहेत:

  • एक ते एक
  • एक ते अनेक
  • अनेक ते एक
  • अनेक - ते अनेक

आणि आम्ही सर्वात सोप्या पर्यायासह विश्लेषण सुरू करू - अनेक - एक .

एसक्यूएल मधील टेबल्समधील असा संबंध तुम्ही आधीच पाहिला आहे. हे सहसा असे दिसते:

आयडी नाव व्यवसाय पगार वय रुजू दिनांक
इव्हानोव्ह इव्हान प्रोग्रामर 100000 २५ 2012-06-30
2 पेट्रोव्ह पेत्र प्रोग्रामर 80000 23 2013-08-12
3 इव्हानोव्ह सेर्गे परीक्षक 40000 तीस 2014-01-01
4 राबिनोविच मोइशा दिग्दर्शक 200000 35 2015-05-12
किरिएन्को अनास्तासिया कार्यालय व्यवस्थापक 40000 २५ 2015-10-10
6 वास्का मांजर 1000 3 2018-11-11

कर्मचारी टेबल:

या सारणीमध्ये खालील स्तंभ आहेत:

  • आयडी INT
  • VARCHAR नाव
  • व्यवसाय VARCHAR
  • पगार INT
  • वय INT
  • join_date DATE

आणि अशा प्रकारे कार्य सारणी , ज्यामध्ये कर्मचार्‍यांसाठी कार्ये आहेत, असे दिसते:

आयडी कर्मचारी_आयडी नाव अंतिम मुदत
फ्रंटएंडवरील बगचे निराकरण करा 2022-06-01
2 2 बॅकएंडवरील बगचे निराकरण करा 2022-06-15
3 कॉफी विकत घ्या 2022-07-01
4 कॉफी विकत घ्या 2022-08-01
कॉफी विकत घ्या 2022-09-01
6 (निरर्थक) ऑफिसची साफसफाई करा (निरर्थक)
4 जीवनाचा आनंद घे (निरर्थक)
8 6 जीवनाचा आनंद घे (निरर्थक)

या सारणीमध्ये फक्त 4 स्तंभ आहेत:

  • id - अद्वितीय कार्य क्रमांक (आणि टेबलमधील पंक्ती);
  • कर्मचारी_आयडी - कर्मचारी टेबलमधील कर्मचारी आयडी ज्यावर कार्य नियुक्त केले आहे;
  • नाव - नाव आणि कार्याचे वर्णन;
  • अंतिम मुदत - ज्या वेळेत कार्य पूर्ण करणे आवश्यक आहे.

आम्ही पाहतो की टास्क टेबलमधील अनेक पंक्ती कर्मचारी टेबलमधील एका नोंदीचा संदर्भ घेऊ शकतात. अशा सारणी-स्तरीय संबंधांना अनेक-ते -एक असे म्हणतात.

2.2 Java वर्ग स्तराशी संबंध

टेबल स्तरावरील संप्रेषणाव्यतिरिक्त, आपण हायबरनेटमधील घटक वर्गांच्या स्तरावर संप्रेषण देखील आयोजित करू शकता. हे एका भाष्याने केले जाते @ManyToOne.

परंतु प्रथम, फक्त दोन वर्ग तयार करूया: कर्मचारी आणि कर्मचारी कार्य :

@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="occupation")
   public String occupation;

   @Column(name="salary")
   public Integer salary;

   @Column(name="join_date")
   public Date join;
}

आणि कर्मचारी नोकर्‍या साठवण्यासाठी दुसरा वर्ग:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

  @Column(name="employee_id")
   public Integer employeeId;

   @Column(name="deadline")
   public Date deadline;
}

या वर्गांमध्ये सर्व काही ठीक आहे, परंतु कर्मचारी वर्गाचे कर्मचारी आयडी फील्ड कर्मचारी वर्गाच्या आयडी फील्डचा संदर्भ देते हे वस्तुस्थिती दर्शवेल असा कोणताही संबंध त्यांच्यामध्ये नाही. ते दुरुस्त करण्याची वेळ आली आहे

2.3 @ManyToOne भाष्य.

प्रथम, जावामध्ये आम्हाला त्यांच्या आयडी ऐवजी ऑब्जेक्ट्स (आणि ऑब्जेक्ट संदर्भ) वर ऑपरेट करण्याची सवय आहे. तर सर्वप्रथम, EmployeeTask वर्गातील एम्प्लॉयीआयडी फील्डऐवजी, एम्प्लॉयी टाइपच्या ऑब्जेक्टकडे निर्देश करूया. आमचा नवीन वर्ग कसा दिसेल ते येथे आहे:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @ManyToOne
   @JoinColumn(name = "employee_id")
   public Employee employee;

   @Column(name="deadline")
   public Date deadline;
}

भाष्याच्या मदतीने @ManyToOne, आम्ही सूचित केले आहे की अनेक EmployeeTask ऑब्जेक्ट्स एम्प्लॉयी प्रकारातील एका ऑब्जेक्टचा संदर्भ घेऊ शकतात. तसेच, भाष्य @JoinColumn वापरून , आम्ही आमच्या टेबलच्या कोणत्या कॉलममध्ये कर्मचारी ऑब्जेक्टचा आयडी संग्रहित केला आहे हे सूचित केले.

2.4 उदाहरणांची विनंती करा

आणि आता अशा संबंधित वर्गांसह हायबरनेट कसे कार्य करू शकते याची काही उदाहरणे दाखवू.

परिस्थिती एक

विशिष्ट वापरकर्त्याला नियुक्त केलेली सर्व कार्ये शोधण्यासाठी एक क्वेरी लिहूया. ही क्वेरी HQL मध्ये कशी दिसेल ते येथे आहे:

from EmployeeTask where employee.name = "Ivan Ivanovich"

तुम्ही फक्त एका बिंदूद्वारे अवलंबून असलेल्या वर्गांच्या फील्डचा संदर्भ घेऊ शकता. हे खूप आरामदायक आहे. पण तरीही ही क्वेरी Java कोडच्या स्वरूपात लिहूया:

String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

परिस्थिती दोन

ज्या कर्मचार्‍यांची थकीत कामे आहेत त्यांची यादी परत करणारी क्वेरी लिहू. एखाद्या कार्याची अंतिम मुदत भूतकाळात असेल तर त्याची मुदत संपली आहे. SQL मध्ये ती क्वेरी कशी दिसेल ते येथे आहे:

SELECT DISTINCT employee.*
FROM task JOIN employee ON task.employee_id = employee.id
WHERE task.deadline < CURDATE();

DISTINCTवापरले जाते कारण एका वापरकर्त्याला अनेक कार्ये नियुक्त केली जाऊ शकतात.

आणि आता तीच क्वेरी HQL मध्ये लिहू:

select distinct employee from EmployeeTask where deadline < CURDATE();

या प्रश्नातील कर्मचारी हे EmployeeTask वर्गाचे फील्ड आहे

परिस्थिती तीन

न नियुक्त केलेली सर्व कामे दिग्दर्शकाला सोपवा. SQL क्वेरी असे दिसेल:


UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

आणि आता तीच क्वेरी HQL मध्ये लिहू:

update EmployeeTask set employee = :user where employee is null

शेवटची क्वेरी सर्वात कठीण आहे. आम्हाला डायरेक्टरचा आयडी पास करणे आवश्यक आहे, परंतु EmployeeTask क्लासमध्ये असे फील्ड नसते जिथे आम्ही आयडी लिहू शकतो, त्याऐवजी त्यामध्ये कर्मचारी फील्ड असते जिथे आम्हाला एम्प्लॉयी प्रकारातील ऑब्जेक्टचा संदर्भ नियुक्त करणे आवश्यक असते.

Employee director = session.get(Employee.class, 4);

String hql = "update EmployeeTask set employee = :user where employee is null";
Query<EmployeeTask> query = session.createQuery(hql, EmployeeTask.class);
query.setParameter("user", director);
query.executeUpdate();
टिप्पण्या
  • लोकप्रिय
  • नवीन
  • जुने
टिप्पणी करण्यासाठी तुम्ही साईन इन केलेले असणे आवश्यक आहे
या पानावर अजून कोणत्याही टिप्पण्या नाहीत