hibernate一对一懒加载

  我们都知道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”就不起作用了。这次就到这里,在一对一中使用懒加载对性能并没有明显提升,但是在其他关联关系中就不同了。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenwill3/article/details/6874476
个人分类: 懒加载 hibernate
上一篇hibernate多对多关联关系
下一篇hibernate,struts2的工作原理
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭