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 .