Mulige objektstatusindstillinger

Som du måske har bemærket, når et objekt er knyttet til Hibernate, kaldes dets tilstand Vedvarende eller Administreret . Hvordan rigtigt? Vedvarer eller administreres?

Det er muligt og så, og så. Ifølge JPA-specifikationen har et objekt en Persist-tilstand, og ifølge Hibernate-specifikationen kaldes dets tilstand Managed.

I Hibernate udføres arbejdet med databasen gennem et objekt af typen org.hibernate.Session . Ifølge JPA skal klassen hedde javax.persistence.EntityManager. Dette er egentlig ikke et stort problem, da begge typer er grænseflader.

org.hibernate.Session -grænsefladen erklæres således:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Derfor har Session- grænsefladen alle de metoder, der er i EntityManager- grænsefladen . Men den har også sin egen, som den har arvet fra tidligere versioner af Hibernate, hvor der endnu ikke var nogen JPA-specifikation.

Hele denne situation er beskrevet som følger:

Lad os tage et kig på alle de metoder, som sessionsgrænsefladen har, såvel som nuancerne i deres arbejde.

Nuancerne i persist()-metoden

Når du gemmer et objekt i databasen, skal du huske to ting.

For det første vil lagring af objektet til sidst resultere i udførelse af en af ​​SQL-kommandoerne: INSERT eller UPDATE. For det andet vil disse handlinger ikke forekomme umiddelbart efter kald af objektets metodesession, men først efter at have afsluttet transaktionen.

Lad os overveje en simpel situation, for eksempel har du en brugerklasse :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

Lad os gemme dets objekt i databasen ved hjælp af persist() metoden .

User user = new User();
user.setName("Kolyan");
session.persist(user);

Formålet med denne metode er at gemme et nyt objekt i databasen. Hvis der endnu ikke er et sådant objekt, vil det blive tilføjet til databasen ved at kalde INSERT SQL-metoden .

Hvis objektet allerede er i databasen, sker der ikke noget. Et tredje tilfælde er dog også muligt - et forsøg på at gemme et objekt med statussen Frakoblet i databasen. I dette tilfælde vil der blive kastet en undtagelse. 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!

Nuancerne i save()-metoden

Save()-metoden blev nedarvet af den nuværende Hibernate fra dens tidligere versioner. I sin kerne minder den meget om persist()- metoden , den tilføjer også en ny post til tabellen ved hjælp af INSERT-metoden. Det har dog flere interessante nuancer.

Først returnerer denne metode en værdi - det nye id for objektet . Som du allerede ved, har objekter normalt ikke et ID, før de tilføjes til databasen, og det er allerede tildelt af databasen. Så save() -metoden for sessionsobjektet returnerer det ID, der blev tildelt det gemte objekt.

Vigtig! Ifølge Hibernate ID-specifikationen kan det være et hvilket som helst objekt, der kan serialiseres, ikke kun et nummer. Det kan være en streng, et tal, en enum, hvad som helst i almindelighed, der kan sættes helt i én kolonne i en tabel i databasen.

Save()- metoden har en serialiseret resultattype, så dens resultat skal castes til den korrekte type:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Save()- metoden har også en anden adfærd i tilfælde af objektets løsrevet tilstand. Den betragter et sådant objekt som nyt og tilføjer blot en anden post:

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);

Variablerne id og id2 vil være forskellige. To poster vil blive tilføjet til tabellen i databasen, en for hver save() -operation .