下午看了Hibernate的视频,讲到了单条查询语句get和load方法的区别,主要有三点:
- get方法会返回一个持久化类的对象,load方法则返回一个代理对象,其中只保存了持久化类的id属性
- get方法查询时会立即执行sql语句,load方法查询时则不会立即执行sql语句,而是当真正用到被查询对象(即被查询数据)的某个其他属性(即该条数据字段)时,才会去执行sql语句
- 当被查询对象不存在(即数据库中某条数据不存在)时,get方法会返回一个null,而load方法会直接抛出异常(org.hibernate.ObjectNotFoundException)
打开eclipse测试一下get和load方法的区别:
@Test
public void loadAndGet() {
Student s = new Student("小黄", 98, "男", new Date());
Student s1 = new Student("小李", 28, "男", new Date());
session.save(s);
session.save(s1);
Student sGet = (Student) session.get(Student.class, 1);
Student sLoad = (Student) session.load(Student.class, 2);
System.out.println(sGet.toString());
System.out.println(sLoad.toString());
}
- 设置开启sql语言的打印和格式化,主键的生成策略为native。JUnit测试正常无报错,数据库正确生成表并保存数据,按照上面贴出的代码段,应该get和load方法都会打印输出select语句(重写了student对象的toString()方法,用到了student的所有属性,所以load方法也执行了sql语句),但是发现怎么也看不见select语句的打印输出!!!!只有建表跟插入语句。
- 于是又测试了hibernate的update、delete方法,也能打印正确的update跟delete的sql语句,就是不打印select!!!!
- 解决:hibernate.cfg.xml配置文件中建表模式问题:
<property name="hbm2ddl.auto">create</property>
create模式下就是不打印select语句,非常执着~~,其他一切正常,改为update方式后即可打印select语句。。