hibernate的get(java.lang.Class arg0, java.io.Serializable arg1) 再续

来源:互联网 发布:淘宝盗图怎样不被发现 编辑:程序博客网 时间:2024/05/18 00:07

主要讨论get(java.lang.Class arg0, java.io.Serializable arg1)和load(java.lang.Class arg0, java.io.Serializable arg1)区别

根据上篇加了lazy=“false”

将测试类改成:

package com.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test11 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  SessionFactory sf=new Configuration().configure().buildSessionFactory();
  Session session=sf.openSession();
  Group g1=new Group();
  g1.setName("g1");
  
  Group g2=new Group();
  g2.setName("g2");
  
  User user1=new User();
  user1.setName("u1");
  user1.setGroup(g1);
  
  User user2=new User();
  user2.setName("u2");
  user2.setGroup(g2);
  
   Transaction tx=session.beginTransaction();
   session.save(g1);
   int id=g1.getId();
   System.out.println("id--"+id);
   session.save(g2);
   session.save(user1);
   session.save(user2);
   session.flush();
   tx.commit();

   //缓存?直接找到存在session里面的对象?
   Group g=(Group)session.load(Group.class, id);
   System.out.println("name---"+g.getName());
   System.out.println("s---"+g.getUsers().size());
   session.clear();
   
   int id2=g1.getId();
   System.out.println("id2--"+id2);
   
   Group gg2=(Group)session.load(Group.class, id2);
   
   System.out.println("gg2name---"+gg2.getName());
  
   System.out.println("gg2size---"+gg2.getUsers().size());
   
   session.close();


  
 }

}


 

 后台打印:
Hibernate: select hibernate_sequence.nextval from dual
id--119
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_group (name, id) values (?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
Hibernate: insert into t_user (name, groupId, id) values (?, ?, ?)
name---g1
s---0
id2--119
Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?
gg2name---g1
gg2size---1

上篇的get(java.lang.Class arg0, java.io.Serializable arg1)是执行完这行代码,就查询数据库,产生SQL语句。

这里load(java.lang.Class arg0, java.io.Serializable arg1),即  Group gg2=(Group)session.load(Group.class, id2);是执行完了这行代码之后,没有产生SQl语句。

当   System.out.println("gg2name---"+gg2.getName());产生Hibernate: select group0_.id as id3_0_, group0_.name as name3_0_ from t_group group0_ where group0_.id=?
Hibernate: select users0_.groupId as groupId1_, users0_.id as id1_, users0_.id as id4_0_, users0_.name as name4_0_, users0_.groupId as groupId4_0_ from t_user users0_ where users0_.groupId=?
gg2name---g1

 

总结:

load(java.lang.Class arg0, java.io.Serializable arg1),根据主键arg1找对象,没有在session里找到缓存对象的话,产生一个代理,当调用方法时,到数据库查询数据。

get(java.lang.Class arg0, java.io.Serializable arg1),不会产生代理。