5.1 ஒருவருக்கு ஒருவர் தொடர்புகொள்வதற்கான பல்வேறு வடிவங்கள்
இரண்டு நிறுவன வகுப்புகளுக்கு இடையிலான உறவின் மற்றொரு சுவாரஸ்யமான மற்றும் குறிப்பிட்ட வழக்கு உள்ளது - ஒன்றுக்கு ஒன்று உறவு.
நான் இந்த வழக்கை மிகவும் குறிப்பிட்டதாக அழைக்கிறேன், ஏனெனில் இது தரவுத்தளத்தை விட ஜாவா பொருள்களைப் பற்றியது. தரவுத்தளத்தில், அட்டவணைகளுக்கு இடையிலான உறவுக்கு இரண்டு விருப்பங்கள் மட்டுமே உள்ளன:
- அட்டவணை வரிசையில் மற்றொரு அட்டவணையின் ஐடிக்கான இணைப்பு உள்ளது.
- சேவை அட்டவணை பல-பல உறவுகளுக்குப் பயன்படுத்தப்படுகிறது.
நிறுவன வகுப்புகளின் விஷயத்தில், பல சிறுகுறிப்புகளால் விவரிக்கப்படும் விருப்பங்கள் இருக்கலாம்:
- @பதிக்கப்பட்ட
- ஒரு பக்க OneToOne
- இருதரப்பு OneToOne
- @MapsId
அவற்றில் மிகவும் பிரபலமானவற்றை நாங்கள் கீழே கருதுவோம்.
5.2 உட்பொதிக்கப்பட்டது
மூலம், நாங்கள் ஏற்கனவே எளிமையான ஒன்றுக்கு ஒன்று@Embedded
தொடர்பு விருப்பத்தை கருத்தில் கொண்டுள்ளோம் - இது ஒரு சிறுகுறிப்பு . இந்த வழக்கில், தரவுத்தளத்தில் ஒரே அட்டவணையில் இரண்டு வகுப்புகள் சேமிக்கப்பட்டுள்ளன.
பயனர் முகவரி வகுப்பில் பயனரின் முகவரியைச் சேமிக்க விரும்புகிறோம் என்று வைத்துக் கொள்வோம் :
@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;
}
முக்கியமான!பணியாளர் அட்டவணையில் task_id புலம் இல்லை , அதற்கு பதிலாக பணி அட்டவணையின் பணியாளர்_ஐடி புலம் அட்டவணைகளுக்கு இடையே ஒரு உறவை ஏற்படுத்த பயன்படுகிறது .
பொருள்களுக்கு இடையே ஒரு இணைப்பை நிறுவுவது இதுபோல் தெரிகிறது:
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();
GO TO FULL VERSION