4.1 Tranzakciók és adatbázis integritás

Az adatbázis normál működési módja az, amikor percenként több ezer kérést kap több száz különböző klienstől. Ebben az esetben gyakran előfordulnak olyan helyzetek, amikor ugyanazokat az adatokat különböző lekérdezésekből érik el.

Ritkábban, de ismétlem, időről időre előfordulnak olyan helyzetek, amikor egy kérés beolvas egy bizonyos sort, és egy másik kérés egyidejűleg megváltoztatja azt. Képzeld el, mi történik, ha valaki elolvas egy sort, amely csak félig változott? Semmi jó.

Ezt a problémát többféleképpen is megoldják. Először csak lezárhatja a változó sort. Olvasáshoz és íráshoz egyaránt. Ez a módszer működik, de az alap sebessége nagyon szenved.

A második módszer a karakterlánc zárolása csak íráshoz. Azonban továbbra is probléma lesz, ha valaki megpróbálja elolvasni a részben módosított sort. Következtetés - nem fordulhat elő olyan helyzet, amikor a vonal részben megváltozik.

Ezért kitaláltak egy harmadik módszert - a tranzakciókat. A tranzakció olyan műveletek csoportja, amelyeket vagy együtt, vagy egyáltalán nem hajtanak végre. Nem fordulhat elő olyan helyzet, hogy a cselekvések egy részét végrehajtották, a második részét pedig nem. Ha nem lehet végrehajtani az összes módosítást, akkor a már végrehajtott összes módosítást visszaállítja.

Bármely modern SQL szerver lehetővé teszi az adatok módosítását csak a tranzakciókban. Megnyit egy tranzakciót, módosíthat tetszőleges számú táblát, és véglegesíti a tranzakciót. Az SQL Server ezután megpróbálja végrehajtani a változtatásokat. Ha minden rendben van, akkor felkerülnek az általános adatbázisba. Ha problémák merültek fel, akkor minden módosítás törlődik.

A Hibernate is ezt a paradigmát használja. Éppen ezért az előző előadásban azt láttuk, hogy az Employee objektum adatbázisba mentésekor először megnyílt egy tranzakció, majd mentés után véglegesítésre került.

Részletesebben kitérünk erre a témára, de egyelőre csak tudja, miért van szükség a tranzakciókra, és hol használják azokat általában.

4.2 Tárgyak beszerzése

Ha a Hibernate egy kérést hajt végre az adatok lekérésére, akkor nincs szükség a tranzakció kifejezett megnyitására. Ezt maga a Hibernate is megteszi, ha jónak látja: megvannak a beállításai, valamint az SQL szerver beállításai.

Elemezzük, hogyan kell dolgozni az adatbázissal. És ezek közül a legegyszerűbb az objektum azonosítója alapján történő megszerzése . Ehhez használja get()a session objektumon lévő metódust . Az ilyen kérés általános formája:

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

Példa:

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

4.3 Objektumok mentése (hozzáadása).

Ha el akarja menteni az objektumát az adatbázisba, akkor egy lekérdezést hajt végre SQL szintenBESZÁLLÍTÁS. Ezért a műveleteket külön tranzakcióként kell végrehajtani. Ezenkívül jobb a sessionpersist() objektum metódusát használni a perzisztencia érdekében .

Az ilyen kérés általános formája:

session.persist(An object);

A metódus persist()nemcsak az alapot változtatja meg, hanem magát az objektumot is. A helyzet az, hogy amikor hozzáadunk egy objektumot az adatbázishoz, ennek az objektumnak a hozzáadása előtt még nincs saját azonosítója . Nos, általában így van, bár vannak árnyalatok. És a hozzáadása után az objektumnak már van azonosítója .

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

A Session objektumnak is van egy metódusa save(), amely hasonló funkciót lát el. Csak arról van szó, hogy a módszer save()a régi Hibernate szabvány, a módszer persist()pedig a JPA szabvány.

4.4 Objektumok törlése

Ha törölni szeretne egy meglévő objektumot, akkor ezt nagyon egyszerűen megteheti. Ehhez a session objektumnak van egy speciális metódusa - remove().

Az ilyen kérés általános formája:

session.remove(An object);

És persze írjuk a kódot egy példával:

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

Miért olyan nehéz, kérdezed?

Nos, először is, az adatbázisban végrehajtott változtatások mindig eltérő és nem mindig nyilvánvaló következményekkel járnak. Másodszor, ehhez az objektumhoz lehetnek gyermekobjektumok, stb. Így a törlési forgatókönyvek gyakran nem triviálisak.