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

来源:互联网 发布:mac popo登录408 编辑:程序博客网 时间:2024/05/22 14:07

    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()方法可以首先判断对象是否存在,然后在获得它。

/** * 测试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();}


 

原创粉丝点击