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