1.1 பிரச்சனையின் பின்னணி
நீங்கள் உண்மையான தரவுத்தளங்களுடன் பணிபுரியத் தொடங்கும்போது, "முன்கூட்டிய தேர்வுமுறை அனைத்து தீமைகளுக்கும் வேர்" என்ற சொற்றொடரை உடனடியாக நினைவில் கொள்வீர்கள். இப்போதுதான் நீ அவளை எதிர்மறையாக நினைவில் வைத்திருக்கிறாய். தரவுத்தளத்துடன் பணிபுரியும் போது, தேர்வுமுறை இன்றியமையாதது. வடிவமைப்பு கட்டத்தில் நீங்கள் ஏற்கனவே அதனுடன் வேலை செய்ய வேண்டும்.
ஹைபர்னேட் தரவுத்தளத்துடன் பணிபுரிவது மிகவும் வசதியானது. சரியான சிறுகுறிப்பு @OneToMany
மற்றும் @ManyToMany
. உதாரணமாக:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
பயனரின் கருத்துகளைப் பெறுவது எவ்வளவு எளிது:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments();
மேலும் நீங்கள் ஒரு பெரிய ஆச்சரியத்தில் இருப்பீர்கள். பயனருக்கு பல ஆயிரம் கருத்துகள் உள்ளன. இதுபோன்ற குறியீட்டை நீங்கள் எழுதினால், பயனரின் அனைத்து கருத்துகளையும் Hibernate நிச்சயமாக ஏற்றிவிடும். ஆனால் அது மிகவும் மெதுவாக இருக்கும், கருத்துகள் நிறைய நினைவகத்தை எடுக்கும் மற்றும் பல.
அதனால அப்படி எழுத முடியல! கோட்பாட்டில், ஆம், ஆனால் நடைமுறையில், இல்லை.
1.2 வசூல் மூலம் விஷயங்களை மோசமாக்குகிறது
பிரச்சனை இன்னும் சுவாரஸ்யமானது. எல்லாவற்றிற்கும் மேலாக, பொதுவாக உங்களுக்கு எல்லா பயனரின் கருத்துகளும் தேவையில்லை. நீங்கள் அவற்றை கிளையண்டில் எங்காவது காட்டினாலும், அதை பகுதிகளாக - பக்கங்களில் செய்ய விரும்புகிறீர்கள்.
எனவே, உங்களுக்கு இது போன்ற முறைகள் தேவை:
public class CommentsManager {
private static final PAGE_SIZE = 50;
public List<Comment> getCommentsPage(int userId, int pageIndex){
User user = session.get(User.class, userId);
List<Comment> comments = user.getComments();
return comments.subList(pageIndex * PAGE_SIZE, PAGE_SIZE);
}
public int getCommentsPageCount(int userId) {
User user = session.get(User.class, userId);
List<Comment> comments = user.getComments();
return Math.ceil( comments.size()/PAGE_SIZE);
}
}
முதல் முறை கருத்துகளின் ஒரு பக்கத்தை மட்டுமே வழங்குகிறது - 50 துண்டுகள். இரண்டாவது முறை கருத்துகளின் பக்கங்களின் எண்ணிக்கையை வழங்குகிறது. மேலும் இது மிக மோசமானது. கருத்துகளின் எண்ணிக்கையைக் கண்டறிய, தரவுத்தளத்திலிருந்து அனைத்து கருத்துகளையும் பதிவிறக்கம் செய்ய வேண்டும்!
1.3 சுரங்கப்பாதையின் முடிவில் ஒளி
எனவே, எங்கள் அற்புதமான குழந்தை சேகரிப்புகளை யாரும் பயன்படுத்துவதில்லை. இல்லை, நிச்சயமாக அவை பயன்படுத்தப்படுகின்றன, ஆனால் HQL வினவல்களின் ஒரு பகுதியாக மட்டுமே. உதாரணமாக இது போன்ற:
public class CommentsManager {
private static final PAGE_SIZE = 50;
public List<Comment> getCommentsPage(int userId, int pageIndex){
String hql = "select comments from User where id = :id";
Query<Comment> query = session.createQuery( hql, Comment.class);
query.setParametr("id", userId);
query.setOffset(pageIndex * PAGE_SIZE);
query.setLimit(PAGE_SIZE);
return query.list();
}
public int getCommentsPageCount(int userId) {
String hql = "select count(comments) from User where id = :id";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParametr("id", userId);
return Math.ceil(query.singleResult()/PAGE_SIZE);
}
}
நல்ல செய்தி என்னவென்றால், தரவுத்தளத்திலிருந்து கூடுதல் தரவை ஏற்ற வேண்டிய அவசியமில்லாத வகையில் எங்கள் முறைகளை செயல்படுத்தலாம். மோசமான செய்தி என்னவென்றால், எங்கள் சேகரிப்பில் வேலை செய்வது எளிதானது அல்ல.
GO TO FULL VERSION