我们都知道hibernate有延迟加载机制,这样做可以使程序和数据库的交互尽量延迟,直到执行sql或hql命令的时候,也就是说程序不会立即访问数据库,也是由于这个原因有的时候我们会遇到懒加载异常。因为这个时候session已经关闭了,我们就不能访问数据库了。解决的办法有2种:
1.使用Hibernate.initialize(要访问的对象);
2.在映射文件中配置lazy=“false”
下面就来看一下一对一的懒加载
在这里先说一下一对多懒加载的条件
(1)从表里的lazy!=true (hibernate默认为proxy)
(2)从表里的constrained=true
(3)从表里的fetch="select"(hibernate默认)
1.来看一下第一种情况
可以先从主表查询从表的信息,这里在主表里设置constrained="true",配置文件如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">
<class name="org.lxh.vo.Person" table="person" >
<id name="id" column="id">
<generator class="increment"/>
</id>
<property name="name" column="name"/>
<!-- <many-to-one name="card" unique="true"/> -->
<one-to-one name="card" constrained="true"/>
</class>
</hibernate-mapping>
我们先从主从查询主表,代码如下
public String load(){
Session ses=null;
Transaction tr=null;
Card card=null;
Person p=null;
try{
ses=HibernateUtil.getThreadLocalSession();
tr=ses.beginTransaction();
card=(Card)ses.get(Card.class, 1);
tr.commit(); //将事务提交
}catch(Exception e){
e.printStackTrace();
}finally{
if(ses!=null){
//ses.close(); //关闭连接,否则会把数据库卡死
HibernateUtil.colseSession();
}
}
return card.getPerson().getName();
//return p.getCard().getBirthday();
}
在这里查询会成功,也就是说主表不会懒加载,但是我们从主表查询从表就会出现懒加载异常。但是如果我们在配置文件里这么写
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">
<class name="org.lxh.vo.Card" table="card" > <!-- 解决方法2 -->
<id name="id" column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="birthday" column="birthday"/>
<one-to-one name="person" constrained="true"/>
</class>
</hibernate-mapping>
此时通过从表查询主表就会出异常,这是因为配置了constrained="true"那么关联关系就是强制性的,hibernate不会去确认关联关系是否存在(不会去访问数据库),所以就产生了异常,至于其他的条件例如lazy和fetch,二者之间是相互制约的关系,如果fetch=“join”,那么配置lazy=“proxy”就不起作用了。这次就到这里,在一对一中使用懒加载对性能并没有明显提升,但是在其他关联关系中就不同了。