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 |
பணியாளர் அட்டவணை:
இந்த அட்டவணையில் பின்வரும் நெடுவரிசைகள் உள்ளன:
- ஐடி INT
- பெயர் VARCHAR
- தொழில் VARCHAR
- சம்பளம் INT
- வயது INT
- 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 நெடுவரிசைகள் மட்டுமே உள்ளன:
- ஐடி - தனிப்பட்ட பணி எண் (மற்றும் அட்டவணையில் உள்ள வரிசைகள்);
- Employee_id - பணி ஒதுக்கப்படும் பணியாளர் அட்டவணையில் இருந்து பணியாளர் ஐடி;
- பெயர் - பணியின் பெயர் மற்றும் விளக்கம்;
- காலக்கெடு - பணியை முடிக்க வேண்டிய நேரம்.
பணி அட்டவணையில் உள்ள பல வரிசைகள் பணியாளர் அட்டவணையில் உள்ள ஒரு பதிவைக் குறிக்கலாம். அத்தகைய அட்டவணை-நிலை உறவு பல- ஒன்று என்று அழைக்கப்படுகிறது.
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;
}
இந்த வகுப்புகளுடன் எல்லாம் நன்றாக இருக்கிறது, ஆனால் ஊழியர் பணி வகுப்பின் EmployeeId புலம் பணியாளர் வகுப்பின் ஐடி புலத்தைக் குறிக்கிறது என்பதை பிரதிபலிக்கும் வகையில் அவர்களுக்கு இடையே எந்த உறவும் இல்லை. அதை சரிசெய்ய வேண்டிய நேரம் இது
2.3 @ManyToOne சிறுகுறிப்பு.
முதலாவதாக, ஜாவாவில் அவற்றின் ஐடியை விட பொருள்களில் (மற்றும் பொருள் குறிப்புகள்) செயல்படுவதற்கு நாம் பழக்கமாகிவிட்டோம். எனவே முதலில், EmployeeTask வகுப்பில் EmployeeId புலத்திற்குப் பதிலாக, Employee வகையின் ஒரு பொருளை மட்டும் சுட்டிக் காட்டுவோம். எங்கள் புதிய வகுப்பு எப்படி இருக்கும் என்பது இங்கே:
@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 ஆப்ஜெக்ட்கள், Employee வகையின் ஒரு பொருளைக் குறிக்கலாம் என்று குறிப்பிட்டுள்ளோம். மேலும், சிறுகுறிப்பைப் பயன்படுத்தி @JoinColumn
, எங்கள் அட்டவணையின் எந்த நெடுவரிசையில் பணியாளர் பொருளின் ஐடி சேமிக்கப்பட்டுள்ளது என்பதைக் குறிப்பிட்டோம்.
2.4 கோரிக்கை எடுத்துக்காட்டுகள்
இப்போது Hibernate போன்ற தொடர்புடைய வகுப்புகளுடன் எவ்வாறு செயல்பட முடியும் என்பதற்கான சில உதாரணங்களைக் காண்பிப்போம்.
காட்சி ஒன்று
ஒரு குறிப்பிட்ட பயனருக்கு ஒதுக்கப்பட்ட அனைத்து பணிகளையும் கண்டறிய வினவலை எழுதுவோம். HQL இல் இந்த வினவல் எப்படி இருக்கும் என்பது இங்கே:
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();
இந்த வினவலில் உள்ள பணியாளர் என்பது 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();
GO TO FULL VERSION