Mogelijke objectstatusopties
Zoals je misschien hebt gemerkt, wordt de status Persistent of Beheerd genoemd wanneer een object is gekoppeld aan Hibernate . Hoe goed? Aanhouden of beheerd?
Het is mogelijk en zo, en zo. Volgens de JPA-specificatie heeft een object de status Persist en volgens de Hibernate-specificatie wordt de status Beheerd genoemd.
In Hibernate wordt met de database gewerkt via een object van het type org.hibernate.Session . Volgens JPA zou de klasse javax.persistentie.EntityManager moeten heten. Dit is niet echt een groot probleem, aangezien beide typen interfaces zijn.
De org.hibernate.Session- interface wordt als volgt gedeclareerd:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Daarom heeft de Session- interface alle methoden die in de EntityManager- interface voorkomen . Maar het heeft ook zijn eigen, die het heeft geërfd van eerdere versies van Hibernate, toen er nog geen JPA-specificatie was.
Deze hele situatie wordt als volgt beschreven:
Laten we eens kijken naar alle methoden die de sessie-interface heeft, evenals de nuances van hun werk.
De nuances van de persist() methode
Wanneer u een object in de database opslaat, moet u twee dingen onthouden.
Ten eerste zal het opslaan van het object uiteindelijk resulteren in de uitvoering van een van de SQL-commando's: INSERT of UPDATE. Ten tweede zullen deze acties niet onmiddellijk plaatsvinden nadat de methode van het object is aangeroepensessie, maar pas na het sluiten van de transactie.
Laten we eens kijken naar een eenvoudige situatie, u hebt bijvoorbeeld een User- klasse :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
Laten we het object opslaan in de database met behulp van de persist() methode .
User user = new User();
user.setName("Kolyan");
session.persist(user);
Het doel van deze methode is om een nieuw object in de database op te slaan. Als er nog geen dergelijk object is, wordt het aan de database toegevoegd door de INSERT SQL-methode aan te roepen .
Als het object al in de database staat, gebeurt er niets. Er is echter ook een derde geval mogelijk: een poging om een object met de status Losgekoppeld op te slaan in de database. In dit geval wordt er een uitzondering gegenereerd. Voorbeeld:
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!
De nuances van de save() methode
De methode save() is overgenomen door de huidige Hibernate van zijn vorige versies. In de kern lijkt het erg op de persist() methode , het voegt ook een nieuw record toe aan de tabel met behulp van de INSERT methode. Het heeft echter verschillende interessante nuances.
Ten eerste retourneert deze methode een waarde - de nieuwe ID van het object . Zoals u al weet, hebben objecten meestal geen ID voordat ze aan de database worden toegevoegd en wordt deze al toegewezen door de database. De methode save() van het sessieobject retourneert dus de ID die aan het opgeslagen object is toegewezen.
Belangrijk! Volgens de Hibernate ID-specificatie kan het elk object zijn dat kan worden geserialiseerd, niet alleen een nummer. Het kan een string zijn, een getal, een opsomming, alles in het algemeen dat volledig in één kolom van een tabel in de database kan worden geplaatst.
De methode save() heeft een geserialiseerd resultaattype, dus het resultaat moet naar het juiste type worden gecast:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
De methode save() gedraagt zich ook anders in het geval van de status Losgekoppeld van het object. Het beschouwt zo'n object als nieuw en voegt gewoon een ander item toe:
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);
De variabelen id en id2 zullen verschillend zijn. Er worden twee records toegevoegd aan de tabel in de database, één voor elke save() -bewerking .
GO TO FULL VERSION