In the previous post we applied the join fetch strategy for collections. Now I shall apply them to a many-to-one and a one-to-one association.
I shall consider a variant of the Book class again.
I now executed a code to load a Book from the database.
I shall consider a variant of the Book class again.
public class DetailedBook { private String name; private Integer id; private Shelf shelf; private BookDetails details; }The Detailed Book has a one-to-one association(shared foreign key) with BookDetails and a many-to-one association with Shelf.
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.collection.smart"> <class name="DetailedBook" table="DETAILED_BOOK"> <id name="id" type="integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="string"> <column name="Name" length="50" not-null="true" /> </property> <many-to-one name="shelf" class="Shelf" foreign-key="DETAILED_BOOK_FK1"
fetch="join" not-null="true"> <column name="shelf_id"></column> </many-to-one> <many-to-one name="details" class="BookDetails" unique="true" cascade = "all" foreign-key="DETAILED_BOOK_FK2" fetch="join" not-null="true"> <column name="details_id"></column> </many-to-one> </class> </hibernate-mapping>As can be seen a join strategy has been applied to eagerly fetch the two associations.
I now executed a code to load a Book from the database.
public static void testLoad() { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); DetailedBook book1 = (DetailedBook) session.load(DetailedBook.class, bookId); System.out.println("Name is " + book1.getName() + " and shelf is" + book1.getShelf().getCode() + ". Book author is " +book1.getDetails().getAuthor()); transaction.commit(); session.close(); }The output logs indicate that only a single query as executed to load the DetailedBook object and the associations:
Hibernate:
/* load com.association.join.DetailedBook */
select detailedbo0_.ID as ID0_2_, detailedbo0_.Name as Name0_2_, detailedbo0_.shelf_id as shelf3_0_2_, detailedbo0_.details_id as details4_0_2_, shelf1_.ID as ID1_0_, shelf1_.CODE as CODE1_0_, bookdetail2_.ID as ID2_1_, bookdetail2_.author as author2_1_, bookdetail2_.description as descript3_2_1_ from DETAILED_BOOK detailedbo0_ left outer join SHELF shelf1_ on detailedbo0_.shelf_id=shelf1_.ID left outer join BOOK_DETAILS bookdetail2_ on detailedbo0_.details_id=bookdetail2_.ID where detailedbo0_.ID=? Name is Simply Fly and shelf isSH001. Book author is Gopinath
No comments:
Post a Comment