metoda get().

Dacă doriți să obțineți un obiect după ID-ul său (sau cheia primară), atunci Hibernate are trei metode pentru aceasta:

  • sarcină()
  • obține()
  • găsi()

Ei fac același lucru, dar există nuanțe. Formatul general al metodei get() este:

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

Metoda get() ia ca al doilea parametru ID-ul (cheia primară) obiectului pe care trebuie să-l returneze. Apoi încarcă acel obiect din baza de date și îl returnează. Exemplu:

User user = session.get(User.class, 2);

Dacă o înregistrare cu acest ID nu este găsită în baza de date, atunci metoda va returna null.

metoda load().

A doua metodă de încărcare a unui obiect este metoda load() . Formatul general al metodei load() este același:

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

Cu toate acestea, comportamentul său este diferit de metoda get() .

În primul rând, această metodă nu returnează un obiect real, ci un proxy: un stub virtual.

În al doilea rând, când se utilizează metoda load() , nu se verifică dacă există o astfel de intrare în baza de date. În schimb, Hibernate creează imediat un obiect proxy cu ID-ul transmis și îl returnează.

În al treilea rând, toate lucrările cu baza de date vor avea loc la apelarea metodelor obiectului proxy. Dacă încercați să apelați, de exemplu, metoda getName() , atunci va avea loc primul apel la baza de date. Exemplu:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

Metoda load() nu trebuie folosită pentru a verifica prezența obiectelor în baza de date - pur și simplu nu va arăta acest lucru. În plus, dacă îi transmiteți un ID nevalid, cum ar fi null, acesta va returna pur și simplu null.

metoda find().

Metoda find() a fost transmisă interfeței Session din standardul JPA. Și după cum știți, acest standard descrie nu doar semnătura metodelor, ci și reglementează comportamentul.

Această metodă funcționează exact ca metoda get() . Dacă obiectul nu a fost găsit de cheia transmisă, atunci metoda va returna pur și simplu null.

User user = session.find(User.class, -2); //method will return null

metoda refresh().

O altă metodă utilă care are legătură cu încărcarea unui obiect dintr-o bază de date este metoda refresh() .

Vă amintiți metoda persist() care a actualizat datele din baza de date pe baza obiectului transmis? Deci, metoda refresh() funcționează exact invers: actualizează un obiect existent pe baza datelor din baza de date.

Acest comportament este necesar dacă, de exemplu, la scrierea unui obiect în baza de date, acolo sunt apelate diverse proceduri stocate care corectează datele scrise.

În astfel de cazuri, poate fi util să recitiți obiectul din baza de date dacă există șansa ca acesta să se fi schimbat. Exemplu:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object