hibernate session 的get 与load的区别

为了区别 load 与 get的 方法的差异 ,特作了以下测试:

 

 实体类: Address.java

 

 

 

package  one2one;

import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.Table;

@Entity
@Table(name
= " ssss " )
public   class  Address  {

    
private int id;
    String  name;




    
public String getName() {
        
return name;
    }





    
public void setName(String name) {
        
this.name = name;
    }





    
public Address() {
        
        
        
    }




    @Id @GeneratedValue(strategy
=GenerationType.AUTO)
    
public int getId() {
        
return id;
    }


    
public void setId(int id) {
        
this.id = id;
    }



    


}

 

hibernate.cfg.xml 的内容:

 

<! DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

< hibernate-configuration >
< session-factory >
    
< property  name ="connection.username" > sa </ property >
        
< property  name ="connection.password" ></ property >
    
< property  name ="connection.url" >
        jdbc:mysql://localhost:3306/db
    
</ property >
    
< property  name ="dialect" >
        org.hibernate.dialect.MySQLDialect
    
</ property >
    
< property  name ="connection.driver_class" >
        com.mysql.jdbc.Driver
    
</ property > <!--
    <property name="hbm2ddl.auto">create</property>
    
    
--><!--

    <property name="connection.provider_class">
        org.hibernate.connection.C3P0ConnectionProvider
    </property>
    <property name="c3p0.max_size">100</property>
    <property name="c3p0.max_statements">100</property>



    
-->
    
    
< mapping  class ="one2one.Address"   />
    
    
<!--

    <mapping class="org.hibernate.test.annotations.join.Cat" />
    <mapping class="org.hibernate.test.annotations.join.Death" />
            
        
--><!--  
    
        
    
-->
    
<!-- <mapping class="annotations.one2one.Ticket" />
        <mapping class="annotations.one2one.Discount" />
        
    
--><!--
        <mapping class="annotations.Inheritance.CreditCardPayment" />
        <mapping class="annotations.Inheritance.Payment" />
        
    
--><!--
        <event type="load">
        <listener
            class="org.hibernate.event.def.DefaultLoadEventListener" />
            <listener
            class="event.Load" />
    </event>
--> </ session-factory >
</ hibernate-configuration >

 

log4j.properties 的内容为:

 

# ## direct log messages to stdout ###
log4j . appender . stdout = org . apache . log4j . ConsoleAppender
log4j
. appender . stdout . Target = System . out
log4j
. appender . stdout . layout = org . apache . log4j . PatternLayout
log4j
. appender . stdout . layout . ConversionPattern =% d{ABSOLUTE}  % 5p  % c{ 1 } :% -   % m % n

# ## direct messages to file hibernate.log ###
#
log4j.appender.file=org.apache.log4j.FileAppender
#
log4j.appender.file.File=hibernate.log
#
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# ## set log levels - for more verbose logging change 'info' to 'debug' ###

log4j
. rootLogger = debug ,  stdout

log4j
. logger . org . hibernate . event . def . DefaultLoadEventListener = debug
log4j
. logger . org . hibernate = error
# log4j.logger.org.hibernate=debug

# ## log HQL query parser activity
#
log4j.logger.org.hibernate.hql.ast.AST=debug

# ## log just the SQL
log4j . logger . org . hibernate . SQL = debug

# ## log JDBC bind parameters ###
log4j . logger . org . hibernate . type = info
# log4j.logger.org.hibernate.type=debug

# ## log schema export/update ###
log4j . logger . org . hibernate . tool . hbm2ddl = debug

# ## log HQL parse trees
#
log4j.logger.org.hibernate.hql=debug

# ## log cache activity ###
#
log4j.logger.org.hibernate.cache=debug

# ## log transaction activity
#
log4j.logger.org.hibernate.transaction=debug

# ## log JDBC resource acquisition
#
log4j.logger.org.hibernate.jdbc=debug

# ## enable the following line if you want to track down connection ###
#
## leakages when using DriverManagerConnectionProvider ###
#
log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

 

HibernateUtil : 一个帮助类:

 

/*
 ************************************************************
 *本文件归属于软件有限公司,未经许可,不得擅自使用、拷贝和修改
 *项目组:ESB小组
 *版 本: SychroESB1.0
 *日 期:2007-11-20
 *时 间:上午08:31:43
 *作 者:Administrator
 ***********************************************************
 
*/

package  annotations;

import  org.hibernate. * ;
import  org.hibernate.cfg. * ;

public   class  HibernateUtil  {

    
private static final SessionFactory sessionFactory;

    
static {
        
try {

            
            sessionFactory 
= new AnnotationConfiguration().configure(
            
"hibernate.cfg.xml").buildSessionFactory();

        }
 catch (Throwable ex) {
            
// Log exception!
            throw new ExceptionInInitializerError(ex);
        }

    }


    
public static Session getSession() throws HibernateException {
        
return sessionFactory.openSession();
    }

}

 

首先确保数据库表中已经有了一条id为1的纪录。

可执行以下程序:

 

package  annotations;

import  one2one.Address;

import  org.hibernate.Session;
import  org.hibernate.SessionFactory;

public   class  Main  {
    
private static SessionFactory sessionFactory;

    
public static void main(String[] args) throws Exception {
        
long st = System.currentTimeMillis();

        Session s 
= HibernateUtil.getSession();

        s.beginTransaction();

    
//    

        
    
        
        Address  a
=new Address();
        
        a.setName(
"sss");
        
        s.save(a);
        
        
    
/*    Address    a=(Address)    s.load(Address.class.getName(), 1);
        
        
        System.out.println();
        
        s.load(Address.class.getName(), 1);
*/

        
        s.flush();
        s.getTransaction().commit();

        s.close();
        
long end = System.currentTimeMillis();
        System.out.println(
"用时: ");
        System.out.print(end 
- st);

    }

}

 

以下是测试过程:

1   首先我们 load 一个 随后在 load一个

如下所示:

 

package  annotations;

import  one2one.Address;

import  org.hibernate.Session;
import  org.hibernate.SessionFactory;

public   class  Main  {
 
private static SessionFactory sessionFactory;

 
public static void main(String[] args) throws Exception {
  
long st = System.currentTimeMillis();

  Session s 
= HibernateUtil.getSession();

  s.beginTransaction();

 
// 

  
 
  
/*  Address  a=new Address();
  
  a.setName("sss");
  
  s.save(a);
  
*/

  
  Address a
=(Address) s.load(Address.class.getName(), 1);
  
  
  System.out.println();
  
  s.load(Address.
class.getName(), 1);
  
  s.flush();
  s.getTransaction().commit();

  s.close();
  
long end = System.currentTimeMillis();
  System.out.println(
"用时: ");
  System.out.print(end 
- st);

 }

}

 

 

执行后控制台输出:

09:48:31,991 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:48:31,991 DEBUG DefaultLoadEventListener:255 - creating new proxy for entity

09:48:32,007 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:48:32,007 DEBUG DefaultLoadEventListener:214 - entity proxy found in session cache
用时:
3343

可以看出在第二次load时是在cache中找到 id为1的纪录的。

我们首先load一个再get同样的纪录,如下:

package  annotations;

import  one2one.Address;

import  org.hibernate.Session;
import  org.hibernate.SessionFactory;

public   class  Main  {
    
private static SessionFactory sessionFactory;

    
public static void main(String[] args) throws Exception {
        
long st = System.currentTimeMillis();

        Session s 
= HibernateUtil.getSession();

        s.beginTransaction();

    
//    

        
    
        
/*        Address  a=new Address();
        
        a.setName("sss");
        
        s.save(a);
        
*/

        
        Address    a
=(Address)    s.load(Address.class.getName(), 1);
        
        
        System.out.println();
        
        s.get(Address.
class.getName(), 1);
        
        s.flush();
        s.getTransaction().commit();

        s.close();
        
long end = System.currentTimeMillis();
        System.out.println(
"用时: ");
        System.out.print(end 
- st);

    }

}

 

执行后输出:

 

09:52:24,741 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:52:24,741 DEBUG DefaultLoadEventListener:255 - creating new proxy for entity

09:52:24,757 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:52:24,757 DEBUG DefaultLoadEventListener:214 - entity proxy found in session cache
09:52:24,757 DEBUG DefaultLoadEventListener:332 - attempting to resolve: [one2one.Address#1]
09:52:24,757 DEBUG DefaultLoadEventListener:369 - object not resolved in any cache: [one2one.Address#1]
09:52:24,772 DEBUG SQL:401 - select address0_.id as id0_0_, address0_.name as name0_0_ from ssss address0_ where address0_.id=?
用时:
3438

 

可知在 执行  s.get(Address.class.getName(), 1) 时虽然在cache中找到了一个代理,但是不能被j解析,只好再次查询数据库。

 

3 我们首先get一个再load一个 看是什么结果:

 

package  annotations;

import  one2one.Address;

import  org.hibernate.Session;
import  org.hibernate.SessionFactory;

public   class  Main  {
    
private static SessionFactory sessionFactory;

    
public static void main(String[] args) throws Exception {
        
long st = System.currentTimeMillis();

        Session s 
= HibernateUtil.getSession();

        s.beginTransaction();

    
//    

        
    
        
/*        Address  a=new Address();
        
        a.setName("sss");
        
        s.save(a);
        
*/

        
        Address    a
=(Address)    s.get(Address.class.getName(), 1);
        
        
        System.out.println();
        
        s.load(Address.
class.getName(), 1);
        
        s.flush();
        s.getTransaction().commit();

        s.close();
        
long end = System.currentTimeMillis();
        System.out.println(
"用时: ");
        System.out.print(end 
- st);

    }

}

输出:

09:55:59,679 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:55:59,679 DEBUG DefaultLoadEventListener:332 - attempting to resolve: [one2one.Address#1]
09:55:59,679 DEBUG DefaultLoadEventListener:369 - object not resolved in any cache: [one2one.Address#1]
09:55:59,679 DEBUG SQL:401 - select address0_.id as id0_0_, address0_.name as name0_0_ from ssss address0_ where address0_.id=?

09:55:59,757 DEBUG DefaultLoadEventListener:171 - loading entity: [one2one.Address#1]
09:55:59,757 DEBUG DefaultLoadEventListener:244 - entity found in session cache
用时:
3437

 

可知在load时得到的实体是在cache中找到的。

 

 

Load在数据库中不存在记录时抛出异常,但get只是返回空指针。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值