Session.load()

本文探讨了Hibernate中load与get方法的区别,特别是在处理数据库中存在与不存在的记录时的行为差异。通过示例展示了这两种方法如何与Session缓存交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 1。load一条不存在的记录
    Employee employee2 = (Employee) session.load(Employee.class, new Integer(100));
        会抛出net.sf.hibernate.ObjectNotFoundException。
    如果不想抛出该Exception, 应该使用session.get(Class clazz, Serializable id);

2. load一条数据库存在的记录
    1)如果session的Cache中存在,那么直接返回该引用。
    Session session = HibernateSessionFactory.currentSession();
        Transaction tx = session.beginTransaction();
        Employee employee1 = new Employee();
        employee1.setAge((byte)10);
        employee1.setBirthDay(new Date());
        employee1.setEmployeeName("HairRoot");
        employee1.setGender('m');
        employee1.setMarried(false);
        session.save(employee1);
        System.out.println(employee1);
       
        //employ1 已经被保存
    Employee employee2 = (Employee) session.load(Employee.class, new Integer(/*employee1.getId()*/100));
        System.out.println(employee2);
        tx.commit();
        session.close();

        可以发现employee1和employee2是同一个引用。打开show_sql=true也会发现,hibernate并没有发送一条select语句给数据库。

    2)如果session的Cache中不存在,那么会立即发送一条select。
        Session session = HibernateSessionFactory.currentSession();
        Transaction tx = session.beginTransaction();
        Employee employee = (Employee) session.load(Employee.class, new Integer(100));
        System.out.println(employee);
        tx.commit();
        session.close();

        后台:Hibernate: select employee0_.id as id0_, employee0_.age as age0_, employee0_.birthDay as birthDay0_, employee0_.employeeName as employee4_0_, employee0_.gender as gender0_, employee0_.married as married0_ from MWS_TEST_EMPLOYEE employee0_ where employee0_.id=?

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值