Hibernate单条查询语句get/load方法区别

来源:互联网 发布:淘宝助理导出订单 编辑:程序博客网 时间:2024/05/29 15:52
  • 下午看了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语句。。
原创粉丝点击