Lehetséges objektumállapot-beállítások
Amint azt már észrevette, ha egy objektum a hibernált állapothoz van csatlakoztatva, állapotát állandónak vagy felügyeltnek nevezik . Mennyire helyes? Fenntartani vagy kezelve?
Lehetséges és így, és úgy. A JPA specifikáció szerint egy objektum Persist állapotú, a Hibernate specifikáció szerint pedig az állapotát felügyeltnek nevezik.
Hibernate módban az adatbázissal való munka egy org.hibernate.Session típusú objektumon keresztül történik . A JPA szerint az osztály neve javax.persistence.EntityManager. Ez nem igazán nagy probléma, hiszen mindkét típus interfész.
Az org.hibernate.Session felület a következőképpen van deklarálva:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Ezért a Session felületen az EntityManager felület összes metódusa megtalálható . De megvan a sajátja is, amit a Hibernate korábbi verzióitól örökölt, amikor még nem volt JPA specifikáció.
Ezt az egész helyzetet a következőképpen írjuk le:
Vessünk egy pillantást a munkamenet interfész összes metódusára, valamint a munkájuk árnyalataira.
A persist() metódus árnyalatai
Amikor egy objektumot ment az adatbázisba, két dolgot kell megjegyeznie.
Először is, az objektum mentése végül az egyik SQL-parancs végrehajtását eredményezi: INSERT vagy UPDATE. Másodszor, ezek a műveletek nem történnek meg közvetlenül az objektum metódusának meghívása utánülés, de csak a tranzakció lezárása után.
Nézzünk meg néhány egyszerű helyzetet, például van egy User osztálya :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
Mentsük az objektumát az adatbázisba a persist() metódussal .
User user = new User();
user.setName("Kolyan");
session.persist(user);
A módszer célja egy új objektum mentése az adatbázisba. Ha még nincs ilyen objektum, akkor az INSERT SQL metódus meghívásával felkerül az adatbázisba .
Ha az objektum már az adatbázisban van, akkor semmi sem fog történni. Azonban egy harmadik eset is lehetséges - egy Leválasztott állapotú objektum adatbázisba mentésére tett kísérlet. Ebben az esetben kivételt adunk. Példa:
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!
A save() metódus árnyalatai
A save() metódust a jelenlegi Hibernate örökölte a korábbi verzióitól. Lényegében nagyon hasonlít a persist() metódushoz , és az INSERT metódussal új rekordot is hozzáad a táblához. Van azonban néhány érdekes árnyalata.
Először is ez a metódus egy értéket ad vissza - az objektum új azonosítóját . Amint azt már tudja, az objektumok általában nem rendelkeznek azonosítóval, mielőtt hozzáadnák őket az adatbázishoz, és azt már az adatbázis hozzárendelte. Tehát a session objektum save() metódusa visszaadja a mentett objektumhoz rendelt azonosítót.
Fontos! A Hibernate ID specifikáció szerint ez lehet bármilyen szerializálható objektum, nem csak egy szám. Ez lehet egy karakterlánc, egy szám, egy enum, általában bármi, ami teljes egészében elhelyezhető egy táblázatban az adatbázisban.
A save() metódus Serialized eredménytípussal rendelkezik, így eredményét a megfelelő típusba kell önteni:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
Ezenkívül a save() metódus másképp viselkedik az objektum leválasztott állapota esetén. Egy ilyen objektumot újnak tekint, és egyszerűen hozzáad egy másik bejegyzést:
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);
Az id és id2 változók eltérőek lesznek. Két rekord kerül hozzáadásra az adatbázis táblájához, egy minden save() művelethez .
GO TO FULL VERSION