Möjliga objektstatusalternativ

Som du kanske har märkt, när ett objekt är kopplat till Hibernate kallas dess tillstånd beständig eller hanterad . Hur rätt? Fortsätter eller hanteras?

Det är möjligt och så, och så. Enligt JPA-specifikationen har ett objekt ett Persist-tillstånd, och enligt Hibernate-specifikationen kallas dess tillstånd Managed.

I Hibernate utförs arbetet med databasen genom ett objekt av typen org.hibernate.Session . Enligt JPA ska klassen heta javax.persistence.EntityManager. Detta är egentligen inget stort problem, eftersom båda typerna är gränssnitt.

Gränssnittet org.hibernate.Session deklareras så här:

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

}

Därför har Session- gränssnittet alla metoder som finns i EntityManager- gränssnittet . Men den har också sin egen, som den ärvt från tidigare versioner av Hibernate, när det ännu inte fanns någon JPA-specifikation.

Hela situationen beskrivs så här:

Låt oss ta en titt på alla metoder som sessionsgränssnittet har, såväl som nyanserna i deras arbete.

Nyanserna i persist()-metoden

När du sparar ett objekt i databasen måste du komma ihåg två saker.

Först kommer att spara objektet så småningom resultera i exekvering av ett av SQL-kommandona: INSERT eller UPDATE. För det andra kommer dessa åtgärder inte att inträffa omedelbart efter anrop av objektets metodsession, men bara efter att transaktionen har avslutats.

Låt oss överväga en enkel situation, till exempel har du en användarklass :

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

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

Låt oss spara dess objekt i databasen med metoden persist() .

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

Syftet med denna metod är att spara ett nytt objekt i databasen. Om det inte finns något sådant objekt än, kommer det att läggas till i databasen genom att anropa INSERT SQL-metoden .

Om objektet redan finns i databasen kommer ingenting att hända. Men ett tredje fall är också möjligt - ett försök att spara ett objekt med statusen Fristående till databasen. I det här fallet kommer ett undantag att kastas. Exempel:

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!

Nyanserna i save()-metoden

Save()-metoden ärvdes av nuvarande Hibernate från dess tidigare versioner. I grunden är den väldigt lik metoden persist() , den lägger också till en ny post i tabellen med metoden INSERT. Det har dock flera intressanta nyanser.

Först returnerar den här metoden ett värde - objektets nya ID . Som du redan vet har objekt vanligtvis inget ID innan de läggs till i databasen och det är redan tilldelat av databasen. Så, metoden save() för sessionsobjektet returnerar det ID som tilldelades det sparade objektet.

Viktig! Enligt Hibernate ID-specifikationen kan det vara vilket som helst serialiserbart objekt, inte bara ett nummer. Det kan vara en sträng, ett nummer, en enum, vad som helst i allmänhet som kan läggas helt i en kolumn i en tabell i databasen.

Metoden save() har en serialiserad resultattyp, så dess resultat måste castas till rätt typ:

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

Dessutom har metoden save() ett annat beteende i fallet med objektets tillstånd fristående. Den betraktar ett sådant objekt som nytt och lägger helt enkelt till en annan 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);

Variablerna id och id2 kommer att vara olika. Två poster kommer att läggas till i tabellen i databasen, en för varje save() -operation .