5.1 एक ते एक संवादाचे विविध प्रकार

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

मी या केसला अतिशय विशिष्ट म्हणतो, कारण हे डेटाबेसपेक्षा Java ऑब्जेक्ट्सबद्दल अधिक आहे. डेटाबेसमध्ये, सारण्यांमधील संबंधांसाठी फक्त दोन पर्याय आहेत:

  • टेबल पंक्तीमध्ये दुसऱ्या टेबलच्या आयडीची लिंक असते.
  • सेवा सारणी अनेक-ते-अनेक संबंधांसाठी वापरली जाते.

घटक वर्गांच्या बाबतीत, असे पर्याय असू शकतात ज्यांचे वर्णन अनेक भाष्यांद्वारे केले जाते:

  • @एम्बेडेड
  • एकतर्फी OneToOne
  • द्विपक्षीय OneToOne
  • @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;
}

हायबरनेट बाकीचे करेल: डेटा एका टेबलमध्ये संग्रहित केला जाईल, परंतु HQL क्वेरी लिहिताना, तुम्हाला क्लास फील्डवर ऑपरेट करणे आवश्यक आहे.

HQL क्वेरी उदाहरण:

select from User where address.city = 'Paris'

5.3 एकतर्फी OneToOne

आता परिस्थितीची कल्पना करा: आमच्याकडे एक स्रोत टेबल कर्मचारी आहे आणि एक कार्य आहे जे कर्मचारी संदर्भित करते. परंतु आम्हाला खात्री आहे की एका वापरकर्त्याला जास्तीत जास्त एक कार्य नियुक्त केले जाऊ शकते. मग आपण या परिस्थितीचे वर्णन करण्यासाठी भाष्य वापरू शकतो @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 द्विपक्षीय OneToOne

मागील पर्याय थोडासा गैरसोयीचा असू शकतो, कारण बर्‍याचदा आपण एखाद्या कर्मचाऱ्याला केवळ एखाद्या कामासाठीच नव्हे तर कर्मचाऱ्याला एखादे कार्य देखील सोपवायचे असते.

हे करण्यासाठी, तुम्ही कर्मचारी वर्गामध्ये EmployeeTask फील्ड जोडू शकता आणि त्यास योग्य भाष्य देऊ शकता.


@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();