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",配置文件如下





    

        
            
        

        
        
        
         
        
     


我们先从主从查询主表,代码如下

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();
    }

在这里查询会成功,也就是说主表不会懒加载,但是我们从主表查询从表就会出现懒加载异常。但是如果我们在配置文件里这么写





      

        
            
              person
            
        

        
         
        
     


此时通过从表查询主表就会出异常,这是因为配置了constrained="true"那么关联关系就是强制性的,hibernate不会去确认关联关系是否存在(不会去访问数据库),所以就产生了异常,至于其他的条件例如lazy和fetch,二者之间是相互制约的关系,如果fetch=“join”,那么配置lazy=“proxy”就不起作用了。这次就到这里,在一对一中使用懒加载对性能并没有明显提升,但是在其他关联关系中就不同了。

你可能感兴趣的:(hibernate一对一懒加载)