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的话就无法继承了。