问题描述
Hibernate.initialize方法可以通过强制加载关联对象实现这一功能:Hibernate.initialize(user.getAddresses());session.close();//通过Hibernate.initialize方法强制读取数据//addresses对象即可脱离session进行操作Sethset=user.getAddresses();TAddressaddr=(TAddress)hset.toArray()[0];System.out.println(addr.getAddress());为了实现透明化的延迟加载机制,hibernate进行了大量努力。其中包括JDKCollection接口的独立实现。如果我们尝试用HashSet强行转化Hibernate返回的Set型对象:Sethset=(HashSet)user.getAddresses();就会在运行期得到一个java.lang.ClassCastException,实际上,此时返回的是一个Hibernate的特定Set实现“net.sf.hibernate.collection.Set”对象,而非传统意义上的JDKSet实现。这也正是我们为什么在编写POJO时,必须用JDKCollection接口(如Set,Map),而非特定的JDKCollection实现类(如HashSet、HashMap)申明Collection属性的原因。回到前面TUser类的定义:publicclassTUserimplementsSerializable{……privateSetaddresses=newHashSet();……HibernateDeveloper’sGuideVersion1.0September2,2004Somanyopensourceprojects.WhynotOpenyourDocuments?}我们通过Set接口,申明了一个addresses属性,并创建了一个HashSet作为addresses的初始实例,以便我们创建TUser实例后,就可以为其添加关联的address对象:TUseruser=newTUser();TAddressaddr=newTAddress();addr.setAddress("Hongkong");user.getAddresses().add(addr);session.save(user);