Files
hibernate8-jpa4-demo/src/test/java/com/ankurm/agent/Demo03Test.java
T

62 lines
2.5 KiB
Java

package com.ankurm.agent;
import jakarta.persistence.EntityAgent;
import org.hibernate.Hibernate;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** Lazy associations are not loaded for you; fetch() loads them on request. */
class Demo03Test {
@Test
void lazyAssociationsNeedFetch() {
try (Lab lab = new Lab(); Transcript t = new Transcript("03-lazy-associations-and-fetch")) {
lab.seed();
lab.sf.runInTransaction(EntityAgent.class, a -> {
Book b = a.get(Book.class, "978-1");
boolean init = Hibernate.isInitialized(b.publisher);
t.line("agent.get(Book): publisher initialized? %s", init);
assertFalse(init);
Object viaGetter;
try {
viaGetter = b.publisher.getName();
} catch (RuntimeException e) {
viaGetter = e.getClass().getSimpleName();
}
t.line("book.publisher.getName() before fetch -> %s", viaGetter);
lab.resetSql();
Publisher p = a.fetch(b.publisher);
t.line("agent.fetch(book.publisher) -> getName() = %s", p.getName());
t.line(" same object as book.publisher? %s, initialized now? %s",
p == b.publisher, Hibernate.isInitialized(p));
t.line(" reading the public field p.name instead -> %s", p.name);
t.sql(" SQL", lab.sql());
assertEquals("Manning", p.getName());
assertEquals(1, lab.sql().size());
});
lab.sf.runInTransaction(EntityAgent.class, a -> {
Publisher p = a.get(Publisher.class, lab.sf.callInTransaction(em ->
em.createQuery("select p.id from Publisher p", Long.class).getSingleResult()));
boolean init = Hibernate.isInitialized(p.books);
t.line("");
t.line("agent.get(Publisher): books collection initialized? %s", init);
assertFalse(init);
lab.resetSql();
var books = a.fetch(p.books);
t.line("agent.fetch(publisher.books) -> %d books", books.size());
t.sql(" SQL", lab.sql());
assertEquals(3, books.size());
assertTrue(Hibernate.isInitialized(books));
});
}
}
}