metodo get()

Se vuoi ottenere un oggetto tramite il suo ID (o chiave primaria), Hibernate ha tre metodi per questo:

  • carico()
  • Ottenere()
  • Trovare()

Fanno la stessa cosa, ma ci sono sfumature. Il formato generale del metodo get() è:

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

Il metodo get() prende come secondo parametro l'ID (Primary Key) dell'oggetto che deve restituire. Quindi carica quell'oggetto dal database e lo restituisce. Esempio:

User user = session.get(User.class, 2);

Se un record con questo ID non viene trovato nel database, il metodo restituirà null.

metodo load()

Il secondo metodo per caricare un oggetto è il metodo load() . Il formato generale del metodo load() è lo stesso:

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

Tuttavia, il suo comportamento è diverso dal metodo get() .

Innanzitutto, questo metodo non restituisce un oggetto reale, ma un proxy: uno stub virtuale.

In secondo luogo, quando si utilizza il metodo load() , non viene verificato se esiste una tale voce nel database. Invece, Hibernate crea immediatamente un oggetto proxy con l'ID passato e lo restituisce.

In terzo luogo, tutto il lavoro con il database avverrà quando si chiamano i metodi dell'oggetto proxy. Se provi a chiamare, ad esempio, il metodo getName() , si verificherà la prima chiamata al database. Esempio:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

Il metodo load() non dovrebbe essere usato per verificare la presenza di oggetti nel database - semplicemente non lo mostrerà. Inoltre, se gli si passa un ID non valido, come null, restituirà semplicemente null.

metodo find()

Il metodo find() è stato passato all'interfaccia Session dallo standard JPA. E come sai, questo standard non descrive solo la firma dei metodi, ma ne regola anche il comportamento.

Questo metodo funziona esattamente come il metodo get() . Se l'oggetto non è stato trovato dalla chiave passata, il metodo restituirà semplicemente null.

User user = session.find(User.class, -2); //method will return null

metodo refresh()

Un altro metodo utile che ha a che fare con il caricamento di un oggetto da un database è il metodo refresh() .

Ricordi il metodo persist () che ha aggiornato i dati nel database in base all'oggetto passato? Quindi, il metodo refresh() funziona esattamente al contrario: aggiorna un oggetto esistente in base ai dati del database.

Questo comportamento è necessario se, ad esempio, durante la scrittura di un oggetto nel database, vengono richiamate diverse stored procedure che correggono i dati scritti.

In tali casi, può essere utile rileggere l'oggetto dal database se c'è la possibilità che sia cambiato. Esempio:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object