Hibernate面试题部分汇总集合(13)

发布时间:2021-06-06

此文档主要简绍J2EE中的hibernate面试突击问题部分集合

如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:

<hibernate-mapping>

<class name=”er” table=”user” lazy=”true”>

……

</class>

</hibernate-mapping>

通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:

User user=(User)session.load(User.class,”1”);(1)

System.out.println(user.getName());(2)

当运行到(1)处时,Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用

精彩图片

热门精选

大家正在看