hibernate的session对象,load懒加载;与get的区别;

声明,使用JDK8和hibernate5.0.7测试
hibernate 的session 对象,作为连接对象,线程不安全,不能定义成全局对象 【定义到方法内部】,通过session来完成 crud 时候;
session 的 get 和 load 方法区别:

	 T   get(calss  ,serializable   id)
     T   load( calss  , serializable   id  ) 

1、get
(1)立即加载
(2)返回真实对象
(3)查询不存在对象,返回null
2、load
(1)懒加载 ,使用到 对象时候发送sql 语句,并且字段为 id 时候直接输出(不发送sql语句)
(2)使用代理对象,第三方jar获取代理对象
(3)查询一个不存在的对象,抛异常

*TIPs: 测试get 方法,可以看出 get 返回值 为真实对象,并且在执行debug 断点语句时候提交sql 语句 [说明及时加载]; *

s

在这里图片描述

当使用 get查询使句酷中不存在的数据时候会返回 null
null

测试load 方法;
懒加载没测出来,仍旧会在未使用对象时候发送sql语句 ,但是查询数据库中不存在的数据时候会抛异常,可以看到 load 方法使用的第三方代理jar ,获取的返回值是代理对象;
代理

抛异常
**
懒加载没测出来,难道 IDEA太智能了?
使用 eclipse测试应该能出来吧 ;知道的大神讲一下;

抽取的 session工具类;

/**
 * @auther SyntacticSugar
 * @data 2018/10/30 0030下午 8:45
 *   抽取hibernate 的session 对象
 */
public class SessionFactoryUtils {
    private static final SessionFactory SESSION_FACTORY;
    private static final Configuration CONFIGURATION;
    static {
        CONFIGURATION=new Configuration().configure() ;
        SESSION_FACTORY=CONFIGURATION.buildSessionFactory();
    }
    //获取session对象
    public static Session getSession() {
       return SESSION_FACTORY.openSession();
    }
}

测试类如下进行对比测试get 和load 的区别:

import com.baidu.bean.Customer;
import com.baidu.utils.SessionFactoryUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;


/**
 * @auther SyntacticSugar
 * @data 2018/10/30 0030下午 6:21
 */
public class HibernateTest {
    @Test
    public void test01() {
        /** 配置是hibernate中的  org.hibernate.cfg.Configuration
         * 加载配置文件
         * 创建sessionFactory
         * 创建session 会话对象
         */
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        Customer customer = new Customer();
        customer.setCust_name("打豆豆");
        session.save(customer);//忘记保存了
        //提交事务,关闭会话
        transaction.commit();
        session.clear();
    }

    /**
     * 使用 get 方法来查询
     *    (1)采用立即加载
     *    (2)返回真实对象
     *     (3)找不到的对象  返回null
     */
    @Test
    public void test02() {
        Session session = SessionFactoryUtils.getSession();
        //  开启事务
        Transaction transaction = session.beginTransaction();
        Customer customer = session.get(Customer.class, 1L);
        System.out.println(customer);
        //
        transaction.commit();
        session.close();
    }
    /**
     * 使用 load 方法来查询
     *    (1)采用 懒加载  ,执行这行代码时候不会发送  sql  ,真正使用这个对象时候发送
     *    使用id  时候不会发sql   , 当打印name 等其他filed时候才会发送sql
     *    (2)返回的代理对象,使用第三方jar获取代理对象
     *    (3)找不到的对象  抛异常
     */
    @Test
    public void test03() {
        Session session = SessionFactoryUtils.getSession();
        //  开启事务
        Transaction transaction = session.beginTransaction();
        Customer customer = session.load(Customer.class, 1L);
        System.out.println(customer.getCust_id());
        //
        transaction.commit();
        session.close();
    }


}

数据库中插入了一条数据

测试 在 主键 id 时候,load 的懒加载特性体现出来了:
load 直接打印 1 ,sql 没有发送,get 发送了sql 语句;
sfd
get 如下:
gh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值