சாத்தியமான பொருள் நிலை விருப்பங்கள்

நீங்கள் கவனித்தபடி, ஹைபர்னேட்டுடன் ஒரு பொருள் இணைக்கப்பட்டால், அதன் நிலை நிரந்தரம் அல்லது நிர்வகிக்கப்பட்டது என்று அழைக்கப்படுகிறது . எப்படி சரி? நீடித்ததா அல்லது நிர்வகிக்கப்படுகிறதா?

இது சாத்தியம் மற்றும் அதனால், மற்றும் அதனால். JPA விவரக்குறிப்பின்படி, ஒரு பொருளுக்கு நிலைத்த நிலை உள்ளது, மேலும் ஹைபர்னேட் விவரக்குறிப்பின்படி, அதன் நிலை நிர்வகிக்கப்பட்டது என்று அழைக்கப்படுகிறது.

ஹைபர்னேட்டில், org.hibernate.Session வகையின் ஒரு பொருளின் மூலம் தரவுத்தளத்துடன் பணி மேற்கொள்ளப்படுகிறது . JPA படி, வகுப்பை javax.persistence.EntityManager என்று அழைக்க வேண்டும். இரண்டு வகைகளும் இடைமுகங்கள் என்பதால் இது உண்மையில் பெரிய பிரச்சனை இல்லை.

org.hibernate.Session இடைமுகம் இவ்வாறு அறிவிக்கப்பட்டுள்ளது:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

எனவே, EntityManager இடைமுகத்தில் உள்ள அனைத்து முறைகளையும் அமர்வு இடைமுகம் கொண்டுள்ளது . ஆனால் இது அதன் சொந்தத்தையும் கொண்டுள்ளது, இது ஹைபர்னேட்டின் முந்தைய பதிப்புகளிலிருந்து பெறப்பட்டது, இது இன்னும் JPA விவரக்குறிப்பு இல்லாதபோது.

இந்த முழு சூழ்நிலையும் பின்வருமாறு விவரிக்கப்பட்டுள்ளது:

அமர்வு இடைமுகம் கொண்டிருக்கும் அனைத்து முறைகளையும், அவற்றின் வேலையின் நுணுக்கங்களையும் பார்ப்போம்.

பெர்சிஸ்ட்() முறையின் நுணுக்கங்கள்

தரவுத்தளத்தில் ஒரு பொருளைச் சேமிக்கும்போது, ​​​​நீங்கள் இரண்டு விஷயங்களை நினைவில் கொள்ள வேண்டும்.

முதலில், பொருளைச் சேமிப்பது இறுதியில் SQL கட்டளைகளில் ஒன்றைச் செயல்படுத்தும்: INSERT அல்லது UPDATE. இரண்டாவதாக, பொருளின் முறையை அழைத்த உடனேயே இந்த செயல்கள் நடக்காதுஅமர்வு, ஆனால் பரிவர்த்தனையை முடித்த பின்னரே.

சில எளிய சூழ்நிலைகளைக் கருத்தில் கொள்வோம், எடுத்துக்காட்டாக, உங்களிடம் ஒரு பயனர் வகுப்பு உள்ளது :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

persist() முறையைப் பயன்படுத்தி அதன் பொருளை தரவுத்தளத்தில் சேமிப்போம் .

User user = new User();
user.setName("Kolyan");
session.persist(user);

இந்த முறையின் நோக்கம் ஒரு புதிய பொருளை தரவுத்தளத்தில் சேமிப்பதாகும். இதுவரை அத்தகைய பொருள் இல்லை என்றால், INSERT SQL முறையை அழைப்பதன் மூலம் அது தரவுத்தளத்தில் சேர்க்கப்படும் .

பொருள் ஏற்கனவே தரவுத்தளத்தில் இருந்தால், எதுவும் நடக்காது. இருப்பினும், மூன்றாவது வழக்கும் சாத்தியமாகும் - பிரிக்கப்பட்ட நிலையுடன் ஒரு பொருளை தரவுத்தளத்தில் சேமிக்கும் முயற்சி. இந்த வழக்கில், ஒரு விதிவிலக்கு தூக்கி எறியப்படும். உதாரணமாக:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

சேவ்() முறையின் நுணுக்கங்கள்

சேவ்() முறை அதன் முந்தைய பதிப்புகளிலிருந்து தற்போதைய ஹைபர்னேட் மூலம் பெறப்பட்டது. அதன் மையத்தில், இது பெர்சிஸ்ட்() முறைக்கு மிகவும் ஒத்திருக்கிறது , இது INSERT முறையைப் பயன்படுத்தி அட்டவணையில் ஒரு புதிய பதிவையும் சேர்க்கிறது. இருப்பினும், இது பல சுவாரஸ்யமான நுணுக்கங்களைக் கொண்டுள்ளது.

முதலில், இந்த முறை ஒரு மதிப்பை வழங்குகிறது - பொருளின் புதிய ஐடி . உங்களுக்கு ஏற்கனவே தெரியும், தரவுத்தளத்தில் சேர்க்கப்படுவதற்கு முன்பு பொருள்களுக்கு பொதுவாக ஐடி இருக்காது மற்றும் அது ஏற்கனவே தரவுத்தளத்தால் ஒதுக்கப்பட்டுள்ளது. எனவே, அமர்வு பொருளின் சேவ்() முறை , சேமித்த பொருளுக்கு ஒதுக்கப்பட்ட ஐடியை வழங்குகிறது.

முக்கியமான! ஹைபர்னேட் ஐடி விவரக்குறிப்பின்படி, இது ஒரு எண்ணாக இல்லாமல், எந்த ஒரு வரிசைப்படுத்தக்கூடிய பொருளாகவும் இருக்கலாம். இது ஒரு சரம், ஒரு எண், ஒரு enum, தரவுத்தளத்தில் ஒரு அட்டவணையின் ஒரு நெடுவரிசையில் முழுவதுமாக வைக்கப்படும் பொதுவாக எதுவும் இருக்கலாம்.

சேவ்() முறையில் வரிசைப்படுத்தப்பட்ட முடிவு வகை உள்ளது, எனவே அதன் முடிவு சரியான வகைக்கு அனுப்பப்பட வேண்டும்:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

மேலும், சேவ்() முறையானது பொருளின் பிரிக்கப்பட்ட நிலையில் வேறுபட்ட நடத்தையைக் கொண்டுள்ளது. இது அத்தகைய பொருளை புதியதாகக் கருதுகிறது மற்றும் மற்றொரு உள்ளீட்டைச் சேர்க்கிறது:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

ஐடி மற்றும் ஐடி2 மாறிகள் வித்தியாசமாக இருக்கும். தரவுத்தளத்தில் உள்ள அட்டவணையில் இரண்டு பதிவுகள் சேர்க்கப்படும், ஒவ்வொரு சேவ்() செயல்பாட்டிற்கும் ஒன்று .