hibernate读取数据库内容,用

1,session.get(Class类型,主键);

  立马发出sql语句。从数据库中取出值装到对象里去

2,session.load(Class类型,主键);

  从数据库里取出一条记录,到内存里,转换成对应的对象。不发出sql语句,什么时候用对象的内容,什么时候发sql语句。

  返回的是代理类,是对象的子类,hibernate给你自动生成的。他并没有直接发出sql语句,当用到对象的内容时,才发出sql'语句

API里的描述:

get(Class clazz, Serializable id)

load(Class theClass, Serializable id)

主键id会自动封箱成Integer,也是实现了序列化接口的。

实验:

数据库里teacher表有这么几天记录:

Test类:

package com.oracle.hibernate.id;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test; public class HibernateCoreAPITest { private static SessionFactory sf = null; @BeforeClass
public static void beforeClass() {
// try-chatch是为了解决Junit有错误不提示的bug
try { sf = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (HibernateException e) { e.printStackTrace();
}
} @Test
public void testTeacherLoad() { Session session = sf.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.load(Teacher.class, 2);
//System.out.println(t.getName());
//session.delete(t);查询出对象删除。 session.getTransaction().commit();
//System.out.println(t.getName()); System.out.println("用load时,t的类型是代理类: "+t.getClass()); } @Test
public void testTeacherGet() {
     Session session = sf.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.get(Teacher.class, 1); session.getTransaction().commit();
//System.out.println(t.getName());
System.out.println("用get时,t的类型是: "+t.getClass()); } @AfterClass
public static void afterClass() {
sf.close();
} }

测试结果:

1,两者打印出的t的类型是:

用load时,t的类型是代理类:   class com.oracle.hibernate.id.Teacher_$$_javassist_1

    javassist是hibernate专门生产动态代理的类库,直接生成二进制码,效率高。不会生成源码再编译。

用get时,t的类型是:   class com.oracle.hibernate.id.Teacher

2,当session  commit之后,如果再t.getName():

用load会报错:org.hibernate.LazyInitializationException: could not initialize proxy - no Session         延迟初始化异常

用get正常,因为它是直接发出sql语句从数据库中查。

3,如果查找id不存在的记录:

  用get会返回null。

  用load,只要你不用它的内容,就不会报错。用时返回ObjectNotFoundException。

hibernate_Session接口_load_get的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  3. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  4. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  8. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

  9. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

随机推荐

  1. word 写博客,直接上传

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  2. RocketMQ 加载配置文件

    BrokerStartup.java // 指定配置文件 if (commandLine.hasOption('c')) { String file = commandLine.getOptionVa ...

  3. Grails入门系列(一)

    Grails入门系列(一) JAVAweb开发技术相对于php,python,note.js等新式技术更为复杂,向来以繁杂的配置著称,但是Java任然被广泛的应用于大型企业级的项目,主要是因为技术成熟 ...

  4. windows下C++操作MySQL数据库

    .安装MySQL 2.建立C++控制台程序,新建CPP源文件,如:sqlconn.cpp 3.工程项目中属性—C/C++--常规—附加包含目录中添加mysql安装目录中的MySQL\MySQL\MyS ...

  5. flume学习以及ganglia(若是要监控hive日志,hive存放在/tmp/hadoop/hive.log里,只要运行过hive就会有)

    python3.6hdfs的使用 https://blog.csdn.net/qq_29863961/article/details/80291654 https://pypi.org/  官网直接搜 ...

  6. 转:css实现强制不换行/自动换行/强制换行

    css实现强制不换行/自动换行/强制换行 [日期:2007-08-22] 来源:  作者: [字体:大 中 小] 强制不换行 div{ white-space:nowrap;} 自动换行 div{  ...

  7. 使用JDK实现动态代理

  8. iOS设备抓包终极解决方案(支持https)

    http://bbs.chinapyg.com/forum.php?mod=viewthread&tid=74423&extra=page%3D1%26filter%3Dtypeid% ...

  9. 使用Docker部署ASP.NET Core应用程序实践

    前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docke ...

  10. C-sharp精华面试题

    注:红色表示答案 一.选择,填空题 1.  在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C). a)   ...