The load()
methods of Session
gives you a way to retrieve a persistent instance
if you already know its identifier. load()
takes a
class object and will load the state into a newly instantiated instance of that
class, in persistent state.
Cat fritz = (Cat) sess.load(Cat.class, generatedId);
// you need to wrap primitive identifiers
long id = 1234;
DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );
Alternatively, you can load state into a given instance:
Cat cat = new DomesticCat();
// load pk's state into cat
sess.load( cat, new Long(pkId) );
Set kittens = cat.getKittens();
Note that load()
will throw an unrecoverable
exception if there is no matching database row. If the class is mapped with a
proxy, load()
just returns an uninitialized proxy and
does not actually hit the database until you invoke a method of the proxy. This
behaviour is very useful if you wish to create an association to an object
without actually loading it from the database. It also allows multiple instances
to be loaded as a batch if batch-size
is defined for
the class mapping.
If you are not certain that a matching row exists, you should use the get()
method, which hits the database immediately and
returns null if there is no matching row.
Cat cat = (Cat) sess.get(Cat.class, id);
if (cat==null) {
cat = new Cat();
sess.save(cat, id);
}
return cat;
You may even load an object using an SQL SELECT ... FOR
UPDATE
, using a LockMode
. See the API
documentation for more information.
Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);
Note that any associated instances or contained collections are not selected FOR
UPDATE
, unless you decide to specify lock
or
all
as a cascade style for the association.
It is possible to re-load an object and all its collections at any time,
using the refresh()
method. This is useful when
database triggers are used to initialize some of the properties of the object.
sess.save(cat);
sess.flush(); //force the SQL INSERT
sess.refresh(cat); //re-read the state (after the trigger executes)
An important question usually appears at this point: How much does Hibernate
load from the database and how many SQL SELECT
s will
it use? This depends on the fetching
strategy and is explained in Section 19.1, “Fetching
strategies”.