Hibernate中Session的load()和get()方法

    Session的load()方法和get()方法根据给定的对象id从数据库表中加载一条记录并转换为一个特定的持久类对象。load()方法在没有找到特定的持久类对象所对应的数据库表中的记录时,会抛出ObjectNotFoundException,而get()方法返回null。


    get()方法和load()方法返回的对象位于Session的缓存中,因此党对他的属性进行修改后,Session清理缓存时,会根据持久化对象的属性来同步更新数据库。


    load()和get()方法的区别:


   (1)load()方法:如果load方法不能再缓存或者数据库中找到对象,会抛出异常;load()方法从不返回null;load()方法返回一个代理类的实例而不是真正的持久实例。代理是一个占位符,当第一次调用他时才装载真正的对象。


    (2)get()方法:如果没有找到对象返回null,另一方面,get()方法从不返回代理类而是直接返回实体类。load()方法可以充分利用内部缓存和二级缓存中的现有数据,而get()方法仅仅在内部缓存中进行数据查找,如果没有发现对应的数据,将越过二级缓存,直接调用SQL完成数据读取。


    该如何选择load()方法和get()方法:


    (1)load()方法应用在对象存在的情况下加载


    (2)利用get()方法可以首先判断对象是否存在,然后在获得它。




[java] view plaincopy
/** 
     * 测试load方法 
     * 一旦加载了持久化实例之后,在代码中对持久化实例所做的修改,将会被保存到数据库中。 
     * 程序对持久化实例所做的修改会在session flush之前被自动保存到数据库中, 
     * 无需程序调用其他方法(不需要调用update方法)。也就是说修改对象的最简单方法就是在session处于打开状态时load它, 
     * 然后直接修改即可。这种方法有一个极大的性能缺陷:当需要修改某条记录的时候,这种做法会产生两条sql语句: 
     * 一条用于查询指定记录,一条用于修改该记录。 
     */  
    public static void testLoad(){  
        Configuration cfg = new Configuration().configure();  
        SessionFactory factory = cfg.buildSessionFactory();  
        Session session = factory.openSession();  
        Transaction transaction = session.beginTransaction();  
        Company company = (Company) session.load(Company.class, 1);  
        System.out.println(company.getShortName());  
        company.setShortName("总公司");  
        transaction.commit();  
        session.close();  
        System.out.println(company.getShortName());  
    }  
      
    /** 
     * 测试get方法 
     */  
    public static void testGet(){  
        Configuration cfg = new Configuration().configure();  
        SessionFactory factory = cfg.buildSessionFactory();  
        Session session = factory.openSession();  
        Transaction transaction = session.beginTransaction();  
        Company company = (Company) session.get(Company.class, 1);  
        System.out.println(company.getShortName());  
        company.setShortName("总厂");  
        transaction.commit();  
        session.close();  
        System.out.println(company.getShortName());  
    }  
      
    /** 
     * 测试load与get方法在数据库中没有匹配记录时的反应 
     * 该程序的输出为:get方法返回值为null。原因: 
     * 如果没有匹配的数据库记录,load方法可能抛出异常HibernateException;如果在类映射文件中指定延迟加载, 
     *          则load方法会返回一个未初始化的代理对象,这个代理对象并没有装载数据库对象,直到程序调用该代理对象的某方法时, 
     *          hibernate才访问数据库。默认情况下为延迟加载 
     * get方法立即访问数据库,如果没有对应的记录,get方法返回null 
     * 两者的主要区别在是否延迟加载。 
     */  
    public static void testLoadAndGet(){  
        Configuration cfg = new Configuration().configure();  
        SessionFactory factory = cfg.buildSessionFactory();  
        Session session = factory.openSession();  
        Transaction transaction = session.beginTransaction();  
        Company company = (Company) session.get(Company.class, 11);  
        if(company == null){  
            System.out.println("get方法返回值为null");  
        }  
        Company company1 = (Company)session.load(Company.class, 11);  
        if(company1 == null){  
            System.out.println("load方法返回值为null");  
        }  
        transaction.commit();  
        session.close();  
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值