To continue from where we left our previous discussion, byte code interception is mainly used when we need to lazily load some of our properties.
Consider the shelf.hbm file below:
Consider the shelf.hbm file below:
<?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.interception"> <class name="Shelf" table="SHELF"> <id name="id" type="integer"> <column name="ID" /> <generator class="native" /> </id> <property name="code" type="string" lazy = "true"> <column name="CODE" length="50" not-null="true" /> </property> <set name="allBooks" cascade="save-update" inverse="true"> <key column="SHELF_ID" not-null="true" /> <one-to-many class="Book" /> </set> </class> </hibernate-mapping>As can be seen the code property has been marked as lazy. This means that the column must be fetched only when the getCode() method is called. Any SQL loading the Shelf row should not load the code column from the database. After applying byte code interception as seen in the previous example, I executed the below test code:
public static void testShelfLoad() { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Shelf shelf = (Shelf) session.load(Shelf.class, shelfId); System.out.println("book with id " + shelf.getId() + " is " + shelf.getCode()); transaction.commit(); session.close(); }The logs indicate the that lazy loading of properties was applied:
Hibernate: /* load com.interception.Shelf */
select shelf0_.ID as ID1_0_ from SHELF shelf0_ where shelf0_.ID=? Hibernate: /* sequential select com.interception.Shelf */
select shelf_.CODE as CODE1_ from SHELF shelf_ where shelf_.ID=? book with id 1 is SH001As can be seen
- The select for Shelf table fetched all columns except code.
- On trying to access the code property of Shelf, a separate fetch call was executed to load the shelf's code property.
No comments:
Post a Comment