SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
Transaction t1 = session1.beginTransaction();
Transaction t2 = session2.beginTransaction();

session1.beginTransaction();


Customer c = (Customer)session1.load(Customer.class, new Long(1));
// Customer c = new Customer();
// c.setName("testName3");
// c.setEmail("testEmail3");
// c.setPassword("testPw3");
// session1.save(c);
//System.out.println(c);
t1.commit();
session1.close();

//TODO 为什么不执行update???
session2.beginTransaction();
session2.saveOrUpdate(c);
//c.setName("zengqiong");
//System.out.println(c);

t2.commit();
session2.close();
请问为什么session1的load没有执行select操作,当执行System.out.println(c)时又执行select操作?另外,update操作只有在System.out.println(c)时才执行???

解决方案 »

  1.   

    试着 改变一下c的一些值再保存,hibernite可能检测到这个对象无变化  不做保存
      

  2.   

    public void testSave1()
    {
    Session session = null;// 不是线程安全的。所以Session通常跟一个事务、一个请求的生命周一样,不会重复利用
    Transaction tx = null;
    User user = null;
    try
    {
    session = HibernateUtils.getSession();
    tx = session.beginTransaction();
    // 临时状态
    user = new User();
    user.setName("钱偲");
    user.setPassword("987654");
    user.setBirthDate(new Date());
    // 持久化状态
    session.save(user);
    user.setName("操龙飞"); }
    catch (Exception e)
    {
    e.printStackTrace();
    tx.rollback();
    }
    finally
    {
    HibernateUtils.closeSession(session);
    }
    // 游离状态
    user.setPassword("123456");
    try
    {
    session = HibernateUtils.getSession();
    tx = session.beginTransaction();
    // 持久化状态
    session.update(user);// 必须显式调用update()
    user.setName("励志哥");
    }
    catch (Exception e)
    {
    e.printStackTrace();
    tx.rollback();
    }
    finally
    {
    HibernateUtils.closeSession(session);
    }
    }
      

  3.   

    1、load()是延时加载,不会立即生成sql语句,不会立即访问数据库,当你第一次使用时才会生成sql语句,返回的是一个cglib代理。load()查询出来的时候永远不可能是空。
    2、当我们不知道对象的状态是临时状态还是游离状态时,就会用到saveOrUpdate(),根据ID和version的值判断是save还是update。 如果有ID和version值,则调用update。如果不存在该记录,则进行insert操作。saveOrUpdate()后对象会变成持久的
      

  4.   

    谢谢各位。原因找到了,显式的配置了lazy=false后就能在控制台输出select,update了。有些奇怪,Hibernate的类级别检索方式应该就是立即检索的啊,怎么需要配置后才行呢?
    p.s:我用的Hibernate版本是3.3
      

  5.   

    自己理解出现问题了,Hibernate类级别默认检索方式为立即检索,但load属于延时加载,所以不会在控制台输出select语句,只有在使用变量时才会输出。将load改为get就可以了。
      

  6.   

    load 和 get的区别:
    1、数据库中不存在与OID对应的数据时,get返回null load抛出异常
    2、load 默认使用延时加载,get则忽略lazy属性的值应用时:
    加载一个对象的目的是访问它的各个属性使用get,其他的则可以用load
      

  7.   

    楼上说的对。当这个对象不在缓存中。适用Load方法是无法加载到的。