Mulige objektstatusalternativer
Som du kanskje har lagt merke til, når et objekt er knyttet til Hibernate, kalles dets tilstand Vedvarende eller administrert . Hvor riktig? Vedvare eller administrert?
Det er mulig og så, og så. I følge JPA-spesifikasjonen har et objekt en Persist-tilstand, og i henhold til Hibernate-spesifikasjonen kalles dets tilstand Managed.
I Hibernate utføres arbeidet med databasen gjennom et objekt av typen org.hibernate.Session . I følge JPA skal klassen hete javax.persistence.EntityManager. Dette er egentlig ikke et stort problem, siden begge typene er grensesnitt.
org.hibernate.Session- grensesnittet er deklarert slik:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Derfor har Session- grensesnittet alle metodene som er i EntityManager- grensesnittet . Men den har også sin egen, som den har arvet fra tidligere versjoner av Hibernate, da det ikke var noen JPA-spesifikasjon ennå.
Hele denne situasjonen er beskrevet som følger:

La oss ta en titt på alle metodene som øktgrensesnittet har, så vel som nyansene i arbeidet deres.
Nyansene til persist()-metoden
Når du lagrer et objekt i databasen, må du huske to ting.
For det første vil lagring av objektet til slutt resultere i utførelse av en av SQL-kommandoene: INSERT eller UPDATE. For det andre vil disse handlingene ikke skje umiddelbart etter å ha kalt objektets metodeøkt, men først etter at transaksjonen er avsluttet.
La oss vurdere en enkel situasjon, for eksempel har du en brukerklasse :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
La oss lagre objektet i databasen ved å bruke persist()- metoden .
User user = new User();
user.setName("Kolyan");
session.persist(user);
Hensikten med denne metoden er å lagre et nytt objekt i databasen. Hvis det ikke er noe slikt objekt ennå, vil det bli lagt til databasen ved å kalle INSERT SQL-metoden .
Hvis objektet allerede er i databasen, vil ingenting skje. Et tredje tilfelle er imidlertid også mulig - et forsøk på å lagre et objekt med statusen Frakoblet i databasen. I dette tilfellet vil et unntak bli kastet. Eksempel:
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!
Nyansene til save()-metoden
Save()-metoden ble arvet av gjeldende Hibernate fra tidligere versjoner. I kjernen er den veldig lik persist()- metoden , den legger også til en ny post i tabellen ved å bruke INSERT-metoden. Den har imidlertid flere interessante nyanser.
Først returnerer denne metoden en verdi - den nye IDen til objektet . Som du allerede vet, har objekter vanligvis ikke en ID før de legges til databasen, og den er allerede tildelt av databasen. Så, save() -metoden til sesjonsobjektet returnerer IDen som ble tildelt det lagrede objektet.
Viktig! I henhold til Hibernate ID-spesifikasjonen kan det være et hvilket som helst serialiserbart objekt, ikke bare et nummer. Det kan være en streng, et tall, en enum, alt generelt som kan settes helt i én kolonne i en tabell i databasen.
Save()- metoden har en serialisert resultattype, så resultatet må castes til riktig type:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
Save() -metoden har også en annen oppførsel i tilfellet med objektets løsrevet tilstand. Den anser et slikt objekt som nytt og legger ganske enkelt til en annen oppføring:
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);
id- og id2-variablene vil være forskjellige. To poster vil bli lagt til tabellen i databasen, en for hver save() -operasjon .
GO TO FULL VERSION