2.1 பெற விருப்பம்
ஹைபர்னேட்டின் டெவலப்பர்கள் நீண்ட காலமாக குழந்தை நிறுவனங்களை ஏற்றுவதில் உள்ள சிக்கலைப் பற்றி அறிந்திருக்கிறார்கள். எனவே அவர்கள் செய்த முதல் விஷயம் , சிறுகுறிப்புகளுக்கு ஒரு சிறப்பு பெறுதல் அளவுருவைச் சேர்ப்பதாகும் @OneToMany
.@ManyToMany
இந்த அளவுரு இரண்டு மதிப்புகளை எடுக்கலாம்:
- ஆவலுடன்
- சோம்பேறி
உதாரணமாக:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
பெறுதல் அளவுரு EAGER க்கு சமமாக இருந்தால் , பெற்றோர் நிறுவனம் ஏற்றப்படும் போது, அதன் அனைத்து குழந்தை நிறுவனங்களும் ஏற்றப்படும். மேலும், ஹைபர்னேட் ஒரு SQL வினவலில் அதைச் செய்ய முயற்சிக்கும், அதிக வினவலை உருவாக்கி, எல்லா தரவையும் ஒரே நேரத்தில் பெறுகிறது.
பெறுதல் அளவுரு LAZY மதிப்பை எடுத்துக் கொண்டால் , பெற்றோர் நிறுவனம் ஏற்றப்படும்போது, குழந்தை நிறுவனம் ஏற்றப்படாது. அதற்கு பதிலாக, ஒரு ப்ராக்ஸி பொருள் உருவாக்கப்படும்.
இந்த ப்ராக்ஸி பொருளின் உதவியுடன், ஹைபர்னேட் இந்த குழந்தை நிறுவனத்திற்கான அணுகலைக் கண்காணித்து, அதை முதல்முறை அணுகும்போது நினைவகத்தில் ஏற்றும்.
கருத்துகளுடன் எங்கள் நிலைமையை நினைவுபடுத்தினால்:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
பின்னர் உங்களுக்கு ஒரு "சிக் தேர்வு" உள்ளது:
என்றால் fetch = FetchType.EAGER
, ஹைபர்னேட் அனைத்து கருத்துகளையும் குறியீட்டின் 1வது வரியில் ஏற்றும்:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
என்றால் fetch = FetchType.LAZY
, 2வது வரியில் உள்ள அனைத்து கருத்துகளையும் Hibernate ஏற்றும்:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
நீங்கள் ஏற்கனவே யூகித்தபடி, எல்லா கருத்துகளையும் ஏற்றாதபோது உங்களுக்கு விருப்பம் இல்லை :)
2.2 இயல்புநிலை மதிப்பு
... சிறுகுறிப்புக்கான பெறுதல் விருப்பத்தை நீங்கள் குறிப்பிடவில்லை என்றால் @ManyTo
, ஹைபர்னேட் இயல்புநிலை மதிப்புகளைப் பயன்படுத்தும்.
வெவ்வேறு சிறுகுறிப்பு வகைகளுக்கு அவை சற்று வித்தியாசமாக இருக்கும். சிறுகுறிப்புகளுக்கு ஆர்வமாக @OneToOne
உள்ளது @ManyToOne
, சிறுகுறிப்புகளுக்கு சோம்பலாக @OneToMany
இருக்கிறது @ManyToMany
. நினைவில் கொள்வது எளிது - நாம் ஒரு பொருளைக் குறிப்பிட்டால், அது முழுமையாக ஏற்றப்படும். நாம் ஒரு தொகுப்பைக் குறிப்பிட்டால், அது முதல் முறையாக அணுகப்படும்போது ஏற்றப்படும்.
2.3 @LazyCollection சிறுகுறிப்பு
நீங்கள் ஏற்கனவே பார்த்தது போல், சேகரிப்புகளுடன் பணிபுரியும் போது பெறுதல் அளவுரு அதிகம் உதவாது. Hibernate இன் படைப்பாளிகள் ஒரு சிறப்பு சிறுகுறிப்பைச் சேர்ப்பதன் மூலம் இதை சரிசெய்ய முயன்றனர் @LazyCollection
. இது பொதுவாக இப்படி எழுதப்படுகிறது:
@LazyCollection(LazyCollectionOption.TRUE)
சேகரிப்பு புலங்களை மேப்பிங் செய்யும் போது அதை நீங்கள் குறிப்பிட வேண்டும்:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
இந்த சிறுகுறிப்பில் மூன்று மதிப்புகளில் ஒன்றை எடுக்கக்கூடிய மதிப்பு அளவுரு உள்ளது:
- சோம்பேறி சேகரிப்பு விருப்பம். உண்மை
- சோம்பேறி சேகரிப்பு விருப்பம். பொய்
- சோம்பேறி சேகரிப்பு விருப்பம். கூடுதல்
முதல் இரண்டு விருப்பங்களும் பெறுதல் விருப்பத்திற்கு மிகவும் ஒத்தவை.
அளவுரு க்கு அமைக்கப்பட்டால் , பெற்றோர் பயனர் பொருள் ஏற்றப்படும்போது LazyCollectionOption.TRUE
கருத்துகள் புலத்தின் மதிப்புகள் தரவுத்தளத்திலிருந்து ஏற்றப்படாது என்று அர்த்தம் . கருத்துப் புலத்தை அணுகும் போது கருத்து வகையின் பொருள்கள் முதல் முறை ஏற்றப்படும். உண்மையில், இது அளவுருவுக்கு சமமானதாகும்FetchType.LAZY
அளவுரு க்கு அமைக்கப்பட்டால் , பெற்றோர் பயனர் பொருளை ஏற்றும் நேரத்தில் LazyCollectionOption.FALSE
கருத்துகள் புலத்தின் மதிப்புகள் தரவுத்தளத்திலிருந்து ஏற்றப்படும் என்று அர்த்தம் . கருத்துப் புலத்தை அணுகும் போது கருத்து வகையின் பொருள்கள் முதல் முறை ஏற்றப்படும். உண்மையில், இது சமமானதாகும் FetchType.EAGER
.
GO TO FULL VERSION