hibernate session 的get 与load的区别
来源:互联网 发布:积极网络用语 编辑:程序博客网 时间:2024/05/20 17:59
为了区别 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只是返回空指针。
- Hibernate的session.get()与load()区别
- Hibernate中Session.load与Session.get的区别
- hibernate中Session.load 与Session.get的区别
- Hibernate中Session.load与Session.get的区别
- Hibernate中Session.load与Session.get的区别
- Hibernate中Session.load与Session.get的区别
- Hibernate中Session.load与Session.get的区别
- Hibernate中session.get()与session.load()的区别
- hibernate session 的get 与load的区别
- Hibernate学习之------>Hibernate中Session.load与Session.get的区别
- session对象get与load的区别
- Hibernate中session.get和session.load的区别
- Hibernate session.get()和session.load()方法的区别
- Hibernate中session.load()和session.get()的区别
- Hibernate中session.load()和session.get()的区别
- Hibernate中session.get()和session.load()的区别
- hibernate的load与get的区别
- Hibernate的get与load的区别
- [收藏]使 IE7 变得更快
- Asp检查组件是否已经安装函数
- 令人深思的教育问题:中美差距从儿童就已拉开
- Asp生成随机数函数函数
- 8888
- hibernate session 的get 与load的区别
- WinCVS从入门到精通(1)
- 为易语言鸣不平
- Asp输出错误警告脚本函数
- CSV文件介绍
- Asp防止刷新页面函数
- ASP.Net中自定义Http处理及应用之HttpHandler篇
- document.getElementById详解
- Nokia官方培训(Symbian 4300)笔记(摘录)