2.1 टेबल लेवल पर लिंकिंग
हमने देखा है कि कैसे हाइबरनेट संग्रह को सहायक तालिकाओं में संग्रहीत करता है। अब आइए जानें कि वास्तविक इकाई वर्गों को संग्रहीत करने वाली पूर्ण तालिकाओं के बीच संबंधों को कैसे व्यवस्थित किया जाए।
हाइबरनेट में इकाई वर्गों के बीच चार प्रकार के संबंध हैं:
- एक -से- एक
- एक से अनेक
- कई -से- एक
- कई -से- कई
और हम विश्लेषण की शुरुआत सरलतम विकल्प - अनेक -से- एक के साथ करेंगे ।
आप SQL में टेबल के बीच इस तरह के संबंध के बारे में पहले ही जान चुके हैं। यहाँ यह आमतौर पर कैसा दिखता है:
पहचान | नाम | पेशा | वेतन | आयु | शामिल होने की तारीख |
---|---|---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 | 25 | 2012-06-30 |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 | 23 | 2013-08-12 |
3 | इवानोव सर्गेई | टेस्टर | 40000 | तीस | 2014-01-01 |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 2015-05-12 |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 2015-10-10 |
6 | वास्का | बिल्ली | 1000 | 3 | 2018-11-11 |
कर्मचारी तालिका:
इस तालिका में निम्नलिखित स्तंभ हैं:
- आईडी आईएनटी
- वचरर नाम
- व्यवसाय VARCHAR
- वेतन आई.टी
- आयु आई.टी
- join_date DATE
और इस प्रकार कार्य तालिका , जिसमें कर्मचारियों के लिए कार्य शामिल हैं, ऐसा दिखता है:
पहचान | कर्मचारी आयडी | नाम | अंतिम तारीख |
---|---|---|---|
1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 |
2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 |
3 | 5 | कॉफी खरीदें | 2022-07-01 |
4 | 5 | कॉफी खरीदें | 2022-08-01 |
5 | 5 | कॉफी खरीदें | 2022-09-01 |
6 | (व्यर्थ) | कार्यालय की सफाई करें | (व्यर्थ) |
7 | 4 | जीवन का आनंद लें | (व्यर्थ) |
8 | 6 | जीवन का आनंद लें | (व्यर्थ) |
इस तालिका में केवल 4 स्तंभ हैं:
- आईडी - अद्वितीय कार्य संख्या (और तालिका में पंक्तियाँ);
- कर्मचारी_आईडी - कर्मचारी तालिका से कर्मचारी आईडी जिसे कार्य सौंपा गया है;
- नाम - कार्य का नाम और विवरण;
- समय सीमा - वह समय जिसके द्वारा कार्य पूरा किया जाना चाहिए।
हम देखते हैं कि कार्य तालिका में कई पंक्तियाँ कर्मचारी तालिका में एकल प्रविष्टि को संदर्भित कर सकती हैं। इस तरह के टेबल-लेवल रिलेशनशिप को मैनी-टू -वन कहा जाता है।
2.2 जावा वर्ग स्तर से संबंध
तालिका स्तर पर संचार के अतिरिक्त, आप हाइबरनेट में इकाई कक्षाओं के स्तर पर भी संचार व्यवस्थित कर सकते हैं। यह एक एनोटेशन के साथ किया जाता है @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
, हमने संकेत दिया है कि कई एंप्लॉयी टास्क ऑब्जेक्ट्स एक प्रकार के कर्मचारी के एक ऑब्जेक्ट को संदर्भित कर सकते हैं। इसके अलावा, एनोटेशन का @JoinColumn
उपयोग करते हुए , हमने संकेत दिया कि हमारी तालिका के किस कॉलम में कर्मचारी वस्तु की आईडी संग्रहीत है।
2.4 अनुरोध उदाहरण
और अब कुछ उदाहरण दिखाते हैं कि हाइबरनेट ऐसे संबंधित वर्गों के साथ कैसे काम कर सकता है।
परिदृश्य एक
आइए एक विशिष्ट उपयोगकर्ता को सौंपे गए सभी कार्यों का पता लगाने के लिए एक प्रश्न लिखें। यह क्वेरी एचक्यूएल में कैसी दिखेगी:
from EmployeeTask where employee.name = "Ivan Ivanovich"
आप केवल डॉट के माध्यम से निर्भर वर्गों के क्षेत्रों का उल्लेख कर सकते हैं। यह बहुत आरामदायक है। लेकिन चलिए फिर भी इस क्वेरी को जावा कोड के रूप में लिखते हैं:
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();
इस प्रश्न में कर्मचारी कर्मचारी कार्य वर्ग का एक क्षेत्र है
स्थिति तीन
सभी अनिर्दिष्ट कार्यों को निदेशक को सौंपें। SQL क्वेरी इस तरह दिखेगी:
UPDATE task SET employee_id = 4 WHERE employee_id IS NULL
और अब उसी प्रश्न को HQL में लिखते हैं:
update EmployeeTask set employee = :user where employee is null
अंतिम प्रश्न सबसे कठिन है। हमें निदेशक की आईडी पास करने की आवश्यकता है, लेकिन एम्प्लॉईटास्क क्लास में एक फ़ील्ड नहीं है जहां हम एक आईडी लिख सकते हैं, इसके बजाय इसमें एक कर्मचारी फ़ील्ड होता है जहां हमें कर्मचारी प्रकार के ऑब्जेक्ट का संदर्भ देने की आवश्यकता होती है।
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();