hibernate的session.get/load方法的比较

public static void main(String[] args) {
		User user = new User();
		user.setName("test3");
		user.setBirthday(new Date());
		try {
			addObject(user);
			User user1 = getUser(user.getId());
			System.out.println("user1" + user1.getClass().getName());
			System.out.println(user.getId());
			System.out.println(user1.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static User getUser(int userId) throws Exception {
		Session session = null;
		User user = null;
		try {
			session = HibernateUtil.getSession();
			user = (User) session.get(User.class, userId);
			//user = (User) session.load(User.class, userId);
			return user;
		} catch (HibernateException e) {
			e.printStackTrace();
			throw e;
		}finally{
			session.close();
		}
	}

打印结果:

Hibernate: insert into USERS (USER_NAME, BIRTHDAY) values (?, ?)
Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.BIRTHDAY as BIRTHDAY0_0_ from USERS user0_ where user0_.USER_ID=?
user1blog.hibernate.domain.User
14
User [birthday=2012-08-14 10:53:50.0, id=14, name=test3]


使用load方法打印的结果:

Hibernate: insert into USERS (USER_NAME, BIRTHDAY) values (?, ?)
user1blog.hibernate.domain.User_$$_javassist_0
15
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at blog.hibernate.domain.User_$$_javassist_0.toString(User_$$_javassist_0.java)
    at blog.hibernate.Base.main(Base.java:25)


session.load(User.class, userId);的理解:



load方法具有懒加载的作用,只会在第一次用到时才会去查询。所以当session关闭后,才第一次用到的话就没法查询了 ,于是就报错了。而get方法没有懒加载的作用。


而且load方法返回的对象永远也不会为Null.


hibernate要求进行映射的类不能是final类型的,因为final类型的类是不能被继承的。这个可以从load方法体会,因为load方法返回的对象实际上是从load(Class clazz,Serializable id)方法的参数Class这个类继承来在实例化的,要是final的话就无法继承了。


posted @ 2012-08-14 10:23  xzf007  阅读(140)  评论(0编辑  收藏  举报