容器的延迟初始(Lazy Initialization)2011-01-27 javaworld 有时候您只是想要获得物件中某个属性的资料,如果您的物件中包括Set等容器物件,若从资料库中载入资料时全部载入所有的物件,却只是为了取得某个属性,显然的这样很没有效率。以Set中的范例来说,如果您只是想取得物件之後,显示物件的某些属性,例如name属性:Session session = sessionFactory.openSession(); User user = (User) session.load(User.class, new Integer(1)); System.out.println(user.getName()); session.close();在这个例子中,email的资讯不必要从资料库中全部载入,在Hibernate中支援容器的延迟初始(Lazy onitialization),只有在真正需要容器物件中的资料时,才从资料库中取得资料,预设容器类会使用延迟加载的功能,例如上面的程式实际上会使用以下的SQL:Hibernate: select user0_.id as id0_, user0_.name as name0_0_ from user user0_ where user0_.id=?可以藉由映射文件中的lazy属性来设定是否使用延迟初始,例如在映射文件中如下设定:User.hbm.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
</hibernate-mapping>由於lazy属性被设定为false,延迟初始的功能被关闭,所以上面的程式会使用以下的SQL来查询:Hibernate: select user0_.id as id0_, user0_.name as name0_0_ from user user0_ where user0_.id=? Hibernate: select emails0_.id as id0_, emails0_.address as address0_ from email emails0_ where emails0_.id=?所有的容器物件之资料一并被查询了,即使程式中还不会使用到容器中的物件资讯。在启用延迟初始的情况下,如果如下查询资料:Session session = sessionFactory.openSession(); User user = (User) session.load(User.class, new Integer(1)); System.out.println(user.getName()); Iterator iterator = user.getEmails().iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } session.close();