1.在懒加载方面的区别:
示例代码如下:
-
public class HibernateTest {
-
-
public static void main(String[] args) {
-
User user = getUser(1);
-
System.out.println(user.getName());
-
}
-
-
static User getUser(int id){
-
Session session =null;
-
try{
-
session = HibernateSessionFactory.getSession();
-
session.beginTransaction();
-
-
① User user =(User)session.load(User.class, id);
-
② User user =(User)session.get(User.class, id);
-
- return user;
-
}finally{
-
session.getTransaction().commit();
-
session.close();
-
}
-
}
执行代码① 使用load方法:
执行结果如下:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.
LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at po.User$$EnhancerByCGLIB$$6b9e0a10.getName(<generated>)
at po.HibernateTest.main(HibernateTest.java:10)
将抛出懒加载异常
执行代码②使用get方法
执行结果如下:
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
张三
执行结果正常输出。
2. 空值处理方面(所查询的值不存在):
示例代码如下:
-
Session session =null;
-
try{
-
session = HibernateSessionFactory.getSession();
-
session.beginTransaction();
-
-
①User user =(User)session.load(User.class, 2);
-
②User user =(User)session.get(User.class, 2);
-
-
System.out.println(user);
-
③ System.out.println(user.getName());
- }finally{
-
session.getTransaction().commit();
-
session.close();
-
}
执行代码① 使用load方法:
执行结果如下:
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [po.User#2]
at org.hibernate. ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:65)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at po.User$$EnhancerByCGLIB$$6b9e0a10.toString(<generated>)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at po.HibernateTest.getUser(HibernateTest.java:19)
at po.HibernateTest.main(HibernateTest.java:9)
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [po.User#2]
at org.hibernate. ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:65)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
at po.User$$EnhancerByCGLIB$$6b9e0a10.toString(<generated>)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at po.HibernateTest.getUser(HibernateTest.java:19)
at po.HibernateTest.main(HibernateTest.java:9)
在①处将抛出
ObjectNotFoundException
异常,该异常在执行load方法发现不存在该对象时就抛出
使用load方法不会立即访问数据库,而是返回一个代理对象,只有在使用时,才回去访问数据库。
执行代码②使用get方法
执行结果如下:
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
null
Exception in thread "main" java.lang. NullPointerException
at po.HibernateTest.getUser(HibernateTest.java:20)
at po.HibernateTest.main(HibernateTest.java:9)
null
Exception in thread "main" java.lang. NullPointerException
at po.HibernateTest.getUser(HibernateTest.java:20)
at po.HibernateTest.main(HibernateTest.java:9)
在执行get方法时,发现查询结果为空,将null赋给user,当执行user.getUser()方法③时会抛出空指针异常。
3.其他区别
1. load方法可以返回实体的代理类,get方法则返回真是的实体类。
2. load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
3. 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据。