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

来源:互联网 发布:淘宝直通车怎么用啊 编辑:程序博客网 时间:2024/05/17 00:52

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


原创粉丝点击