@एक से एक

उपलब्ध

5.1 एक-से-एक संचार के विभिन्न रूप

दो इकाई वर्गों के बीच संबंध का एक और दिलचस्प और बल्कि विशिष्ट मामला है - एक-से-एक संबंध।

मैं इस मामले को बहुत विशिष्ट कहता हूं, क्योंकि यह डेटाबेस की तुलना में जावा ऑब्जेक्ट्स के बारे में अधिक है। डेटाबेस में, तालिकाओं के बीच संबंध के लिए केवल दो विकल्प हैं:

  • तालिका पंक्ति में किसी अन्य तालिका की आईडी का लिंक होता है।
  • सेवा तालिका का उपयोग कई-से-अनेक संबंधों के लिए किया जाता है।

इकाई वर्गों के मामले में, कई एनोटेशन द्वारा वर्णित विकल्प हो सकते हैं:

  • @अंतर्निहित
  • एकतरफा वन टू वन
  • द्विपक्षीय वन टू वन
  • @MapsId

नीचे हम उनमें से सबसे लोकप्रिय पर विचार करेंगे।

5.2 एंबेडेड

वैसे, हमने पहले ही सबसे सरल एक-से-एक@Embedded संचार विकल्प पर विचार किया है - यह एक एनोटेशन है । इस स्थिति में, हमारे पास डेटाबेस में एक ही तालिका में दो वर्ग संग्रहीत हैं।

मान लीजिए कि हम उपयोगकर्ता के पते को UserAddress वर्ग में संग्रहीत करना चाहते हैं :

@Embeddable
class UserAddress {
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

फिर हमें इस पते के साथ उपयोगकर्ता वर्ग में एक फ़ील्ड जोड़ने की आवश्यकता है :

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @Embedded
   public UserAddress address;

   @Column(name="created_date")
   public Date createdDate;
}

हाइबरनेट बाकी काम करेगा: डेटा एक तालिका में संग्रहीत किया जाएगा, लेकिन एचक्यूएल प्रश्न लिखते समय, आपको कक्षा क्षेत्रों पर काम करने की आवश्यकता होगी।

एचक्यूएल क्वेरी उदाहरण:

select from User where address.city = 'Paris'

5.3 एकतरफा एक-से-एक

अब स्थिति की कल्पना करें: हमारे पास एक स्रोत तालिका कर्मचारी और एक कार्य है जो कर्मचारी को संदर्भित करता है। लेकिन हम निश्चित रूप से जानते हैं कि एक उपयोगकर्ता को अधिकतम एक कार्य सौंपा जा सकता है। तब हम इस स्थिति का वर्णन करने के लिए एनोटेशन का उपयोग कर सकते हैं @OneToOne

उदाहरण:

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

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

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

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

हाइबरनेट सुनिश्चित करेगा कि न केवल एक कार्य में एक उपयोगकर्ता है, बल्कि यह भी कि एक उपयोगकर्ता के पास केवल एक ही कार्य है। अन्यथा, यह मामला व्यावहारिक रूप से इससे अलग नहीं है @ManyToOne

5.4 द्विपक्षीय वन टू वन

पिछला विकल्प थोड़ा असुविधाजनक हो सकता है, क्योंकि अक्सर आप किसी कर्मचारी को न केवल एक कार्य सौंपना चाहते हैं, बल्कि एक कर्मचारी को एक कार्य भी सौंपना चाहते हैं।

ऐसा करने के लिए, आप कर्मचारी कार्य फ़ील्ड को कर्मचारी वर्ग में जोड़ सकते हैं और इसे सही एनोटेशन दे सकते हैं।

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

   @OneToOne(cascade = CascadeType.ALL, mappedBy="employee")
   private EmployeeTask task;
}

महत्वपूर्ण!कर्मचारी तालिका में कोई कार्य_आईडी फ़ील्ड नहीं है , इसके बजाय कार्य तालिका के कर्मचारी_आईडी फ़ील्ड का उपयोग तालिकाओं के बीच संबंध स्थापित करने के लिए किया जाता है ।

वस्तुओं के बीच संबंध स्थापित करना इस तरह दिखता है:

Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employee = director;
director.task = task;

session.update(task);
session.flush();

लिंक को हटाने के लिए, लिंक को दोनों वस्तुओं से भी हटाना होगा:

Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.task;

task.employee = null;
session.update(task);

director.task = null;
session.update(director);

session.flush();
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं