Opțiuni posibile pentru starea obiectului

După cum probabil ați observat, atunci când un obiect este atașat la Hibernate, starea acestuia se numește Persistent sau Gestionat . Cât de corect? Persista sau gestionat?

Se poate și așa, și așa. Conform specificației JPA, un obiect are o stare Persist, iar conform specificației Hibernate, starea sa se numește Gestionat.

În Hibernate, lucrul cu baza de date se realizează printr-un obiect de tip org.hibernate.Session . Conform JPA, clasa ar trebui să se numească javax.persistence.EntityManager. Aceasta nu este cu adevărat o problemă mare, deoarece ambele tipuri sunt interfețe.

Interfața org.hibernate.Session este declarată astfel:

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

}

Prin urmare, interfața Session are toate metodele care se află în interfața EntityManager . Dar are și propriile sale, pe care le-a moștenit din versiunile anterioare de Hibernate, când încă nu exista o specificație JPA.

Toată această situație este descrisă după cum urmează:

Să aruncăm o privire la toate metodele pe care le are interfața de sesiune, precum și la nuanțele muncii lor.

Nuanțele metodei persist().

Când salvați un obiect în baza de date, trebuie să vă amintiți două lucruri.

În primul rând, salvarea obiectului va duce în cele din urmă la executarea uneia dintre comenzile SQL: INSERT sau UPDATE. În al doilea rând, aceste acțiuni nu vor avea loc imediat după apelarea metodei obiectuluisesiune, dar numai după închiderea tranzacției.

Să luăm în considerare o situație simplă, de exemplu, aveți o clasă de utilizator :

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

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

Să-i salvăm obiectul în baza de date folosind metoda persist() .

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

Scopul acestei metode este de a salva un nou obiect în baza de date. Dacă nu există încă un astfel de obiect, atunci acesta va fi adăugat la baza de date apelând metoda INSERT SQL .

Dacă obiectul este deja în baza de date, atunci nu se va întâmpla nimic. Cu toate acestea, este posibil și un al treilea caz - o încercare de a salva un obiect cu starea Detașat în baza de date. În acest caz, va fi aruncată o excepție. Exemplu:

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!

Nuanțele metodei save().

Metoda save() a fost moștenită de Hibernate curent din versiunile sale anterioare. În esență, este foarte asemănător cu metoda persist() , de asemenea, adaugă o nouă înregistrare la tabel folosind metoda INSERT. Cu toate acestea, are mai multe nuanțe interesante.

În primul rând, această metodă returnează o valoare - noul ID al obiectului . După cum știți deja, obiectele de obicei nu au un ID înainte de a fi adăugate la baza de date și este deja atribuit de baza de date. Deci, metoda save() a obiectului sesiune returnează ID-ul care a fost atribuit obiectului salvat.

Important! Conform specificației Hibernate ID, poate fi orice obiect serializabil, nu doar un număr. Poate fi un șir, un număr, o enumerare, orice în general care poate fi pus în întregime într-o coloană a unui tabel din baza de date.

Metoda save() are un tip de rezultat Serializat, astfel încât rezultatul său trebuie să fie turnat la tipul corect:

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

De asemenea, metoda save() are un comportament diferit în cazul stării Detached a obiectului. Consideră un astfel de obiect ca nou și adaugă pur și simplu o altă intrare:

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);

Variabilele id și id2 vor fi diferite. Două înregistrări vor fi adăugate la tabelul din baza de date, una pentru fiecare operație de salvare () .