爲了區別 load 與 get的 方法的差異 ,特作了以下測試:
實體類: Address.java
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 的內容:
"-//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 的內容爲:
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的紀錄。
可執行以下程序:
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一個
如下所示:
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同樣的紀錄,如下:
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一個 看是什麼結果:
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只是返回空指針。