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只是返回空指針。

 

 

發佈了35 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章