4.1 Tranzacții și integritatea bazei de date

Modul normal de funcționare al unei baze de date este atunci când primește mii de solicitări în fiecare minut de la sute de clienți diferiți. În acest caz, adesea apar situații când aceleași date sunt accesate din interogări diferite.

Mai rar, dar, din nou, din când în când sunt situații când o cerere citește o anumită linie, iar o altă cerere o modifică în același timp. Imaginați-vă ce se întâmplă dacă cineva citește un rând care este schimbat doar pe jumătate? Nimic bun.

Această problemă este rezolvată în mai multe moduri. În primul rând, puteți doar să blocați linia care se schimbă. Atât pentru citit, cât și pentru scris. Această metodă funcționează, dar viteza bazei suferă foarte mult.

A doua modalitate este de a bloca șirul numai pentru scriere. Cu toate acestea, va exista în continuare o problemă atunci când cineva va încerca să citească linia parțial modificată. Concluzie - nu ar trebui să existe o situație în care linia este parțial schimbată.

Prin urmare, au venit cu o a treia metodă - tranzacțiile. O tranzacție este un grup de acțiuni care sunt efectuate fie toate împreună, fie deloc. Nu poate exista o situație în care o parte din acțiuni au fost efectuate, iar a doua parte nu a fost. Dacă nu este posibil să faceți toate modificările, atunci toate modificările deja făcute sunt anulate.

Orice server SQL modern vă permite să schimbați datele numai în tranzacții. Deschideți o tranzacție, faceți orice modificări la orice număr de tabele și efectuați tranzacția. Apoi SQL Server încearcă să facă modificări. Dacă totul este în regulă, atunci acestea vor fi adăugate la baza de date generală. Dacă au apărut probleme, atunci toate modificările vor fi anulate.

Hibernate folosește și această paradigmă. De aceea, în prelegerea anterioară, am văzut că atunci când încercam să salvăm obiectul Employee în baza de date, o tranzacție a fost mai întâi deschisă, iar după salvare, a fost comisă.

Vom intra în acest subiect mai detaliat, dar deocamdată, știți doar de ce sunt necesare tranzacții și unde sunt utilizate de obicei.

4.2 Obținerea obiectelor

Dacă Hibernate execută o solicitare pentru a obține date, atunci nu este nevoie să deschideți în mod explicit o tranzacție. Hibernate însuși va face acest lucru dacă consideră de cuviință: are setările sale, precum și setările serverului SQL.

Vom analiza modul de lucru cu baza de date. Și cel mai simplu dintre ele este obținerea unui obiect prin ID- ul său . Pentru a face acest lucru, utilizați metoda get()de pe obiectul sesiune . Forma generală a unei astfel de cereri:

Class Name = session.get(Class.class, ID);

Exemplu:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 Salvarea (adăugarea) obiectelor

Dacă doriți să salvați obiectul în baza de date, atunci o interogare va fi executată la nivel SQLINTRODUCE. Prin urmare, acțiunile dvs. trebuie efectuate ca o tranzacție separată. De asemenea, este mai bine să folosiți metoda persist()obiectului sesiune pentru persistență .

Forma generală a unei astfel de cereri:

session.persist(An object);

Metoda persist()schimbă nu numai baza, ci și obiectul în sine. Chestia este că atunci când adăugăm un obiect în baza de date, acest obiect nu are încă propriul ID înainte de a-l adăuga . Ei bine, de obicei așa, deși există nuanțe. Și după adăugarea obiectului are deja un ID .

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

Obiectul Session are , de asemenea, o metodă save()care îndeplinește o funcție similară. Doar că metoda save()este vechiul standard Hibernate și metoda persist()este standardul JPA.

4.4 Ștergerea obiectelor

Dacă doriți să ștergeți un obiect existent, atunci este foarte ușor să faceți acest lucru. Pentru a face acest lucru, obiectul sesiune are o metodă specială - remove().

Forma generală a unei astfel de cereri:

session.remove(An object);

Și, bineînțeles, să scriem codul cu un exemplu:

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

De ce este atât de greu, te întrebi?

Ei bine, în primul rând, orice modificare a bazei de date are întotdeauna consecințe diferite și nu întotdeauna evidente. Și în al doilea rând, acest obiect ar putea avea obiecte copil asociate cu el, etc. Deci, scenariile de ștergere sunt adesea non-triviale.