为了区别 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
}
:%
L
-
%
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的纪录的。
2 我们首先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只是返回空指针。