版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-WORD格式-专业资料-可编辑-Hibernate学习笔记Java相关课程系列笔记之十四-WORD 格式 - 专业资料 - 可编辑 -笔记内容说明100%);Hibernate (梁建全老师主讲,占笔记内容目录一、Hibernate 的概述 11.1 Hibernated匡架的作用 11.2 Hibernate访问数据库的优点 11.3 JDBC访问数据库的缺点1,1.4 Hibernate的设计思想2二、Hibernate的基本使用 32.1 Hibernate的主要结构 3.2.2 Hibernate主要的 API3.2.3 Hiber nate使用步骤 4.2.4 HQL 语句(简要介
2、绍) 1.5三、数据映射类型 1.63.1 映射类型的作用 1.63.2 type映射类型的两种写法 16.四、Hibernate主键生成方式 18.4.1 五种生成方式 1.8五、Hiber nate 基本特性20.5.1 对象持久性 2.05.2处于持久状态的对象具有的特点 2.0.5.3三种状态下的对象的转换 2.1.5.4批量操作:注意及时清除缓存 2.1.5.5案例:三种状态下的对象使用 2.1.5.6一级缓存机制(默认开启) 2.3.5.7一级缓存的好处 2.35.8管理一级缓存的方法 2.45.9延迟加载机制 2.65.10具有延迟加载机制的操作 2.6.5.11常犯的错误 2.
3、65.12延迟加载的原理 2.75.13 Sessio的get和load方法的区别 285 . 1 4延迟加载的好处 2.85 . 1 5案例:测试延迟加载 2.95.16案例:重构NetCTOSS资费管理模块 305.17 Java Web 程序中如何用延 迟加 载操 作(OpenSessionInView) 3.5六、关联映射 4.16.1 一对多关系 one-to-many4.16.2多对一关系 many-to-one4.36 . 3多对多关联映射 many-to-many4.5.6.4关联操作(查询join fetch/级联cascade 496.5继承关系映射 5.7七、Hiber
4、nate 查询方法63.7.1 HQL 查询 6.37.2 HQL 和口 SQL 的相同点 6.3.7.3 HQL 和口 SQL 的不同点 6.3.7.4 HQL典型案例 64.7.5 Criteria查询71.7.6 Native SQL原生 SQL 查询7.3.八、Hibernate 高级特性75.8.1二级缓存 7.58.2二级缓存开启方法及测试 7.5.8.3二级缓存管理方法 7.78.4 二级缓存的使用环境 7.88.5 查询缓存 7.88.6查询缓存开启方法及测试 7.8.8.7 查询缓存的使用环境 7.9九、Hibernate 锁机制 8.09.1 悲观锁 8.09.2 悲观锁的
5、实现原理 8.09.3 悲观锁使用步骤及测试 8.09.4 乐观锁 8.39.5 乐观锁的实现原理 8.39.6 乐观锁使用步骤及测试 8.3十、 其他注意事项 8.510.1源码服务器管理工具 8.5 10.2 利用 MyEclipse 根据数据表自动生成实体类、hbm.xml8.5.10.3根据实体类和 hbm.xml 生成数据表 8.810.4 Hibernate中分页查询使用join fatch的缺点.8810.5 Hibernate的子查询映身寸 89.一、 Hibernate 的概述1.1 Hibernate 框架的作用Hibernate 框架是一个数据访问框架(也叫持久层框 架,
6、可将实体对象变成持久对象,详见第 5 章)。通过 Hibernate 框架可以对数据库进行增删改查操作,为业 务层构建一个持久层。可以使用它替代以前的 JDBC 访问数据。1.2 Hibernate 访问数据库的优点1)简单,可以简化数据库操作代码。2)Hibernate可以自动生成 SQL,可以将 ResultSet 中的记录和实体类自动的映射(转化) 。3)Hibernate不和数据库关联,是一种通用的数据库 框架(支持 30 多种数据库),可以方便数据库移植。 任何数据库都可以执行它的 API。因为Hibernate的API 中是不涉及SQL语句的,它会根据Hibernate的配置文 件
7、,自动生成相应数据库的 SQL 语句。1.3 JDBC 访问数据库的缺点1)需要编写大量的复杂的 SQL 语句、表字段多时 SQL 也繁琐、设置各个问号值。2)需要编写实体对象和记录之间的代码, 较为繁琐。3)数据库移植时需要修改大量的 SQL 语句。1.4 Hibernate 的设计思想Hibernate是基于 ORM (Object Relation Mapping 思 想设计的,称为对象关系映射。负责 Java对象和数据 库表数据之间的映射。Hibernate是一款主流的ORM工具,还有其他很多 ORM 工具,女口: MyBatis(以前叫 iBatis)、胪A。Hibernate 功能
8、比MyBatis强大些,属于全自动类型, MyBatis属 于半自动。但全自动会有些不可控因素,因此有些公 司会用 MyBatis。ORM工具在完成Java对象和数据库之间的映射后:1) 在查询时,直接利用工具取出“对象”(不论是 查询一条记录还是多条记录, 取出的都是一个个对象, 我们不用再去转化实体了) 。2)在增删改操作时,直接利用工具将“对象”更新 到数据库表中(我们不用再去把对象转成数据了) 。3)中间的 SQL+JDBC 细节,都被封装在了工具底 层,不需要程序员参与。注意事项:Java程序想访问数据库,只能通过 JDBC的方 式,而Hibernate框架也就是基于 ORM思想对
9、JDBC的封装。Hibernate是以“对象”为单位进行数据库的操 作。二、 Hibernate 的基本使用2.1 Hibernate 的主要结构1) hibernate.cfg.xml(仅 1 个):Hibernate 的主配置 文件,主要定义数据连接参数和框架设置参数。注意事项:就是个 xml 文件,只是名字比较奇 葩!2) Entity 实体类( n 个,一个表一个):主要用于封 装数据库数据。3) hbm.xml 映射文件( n 个):主要描述实体类和数 据表之间的映射信息。描述表与类,字段与属性的对 应关系。注意事项: hbm.xml 是个后缀,如:命名可写Cost.hbm.xm。2
10、.2 Hibernate 主要的 API1) Configuration:用于加载 hibernate.cfg.xml配置信 息。用于创建 Session Factory2) SessionFactor:y 存储了 hbm.xml 中描述的信息, 内置了一些预编译的SQL,可以创建SessiorM象。3) Session负责对数据表执行增删改查操作。表示 Java 程序与数 据库的 一 次 连接 会话 , 是对以 前 的 Conn ection对象的圭寸装。和 JSP中的session不是一回 事,就是名字一样而已。4) Query:负责对数据表执行特殊查询操作。5) Transaction负
11、责Hibernate操作的事务管理。默-WORD格式-专业资料-可编辑-认情况下Hibernate事务关闭了自动提交功能,需要显 式的追加事务管理(如调用Transaction对象中的commit();提交事务)!注意事项:这些API都是在Hibernate包下的,导包别导 错!第一次访问数据库比较慢,比较耗资源,因为 加载的信息多。2.3 Hibernate使用步骤step1 :建立数据库表。step2:建立Java工程(Web工程也可),引入Hibernate 开发包和数据库驱动包。必须引入的包:hibernate3.ja、 cglib.jar、 dom4j.jar、com mon s-c
12、ollecti on s.jar、com mon s-logg in g.ja-r 等step3:添加hibernate.cfg.xm配置文件,文件内容如下: org.hibernate.dialect.OracleDialectv!-不知道数 据库版本就写 OracleDialect -v/propertyx!-可 在hiber nate3.jar中org.hibernate.dialec包下查看名字 -vproperty n ame=c onn ectio n.url jdbc:oracle:thi n:localhost:1521:dbcha ng vpropertyn ame=c on
13、n ectio n. usernamesystem vpropertyn ame=c onn ecti on .passwordcha ngv/propertyvproperty n ame=c onn ectio n.driver_class oracle.jdbc.driver.OracleDrivervproperty n ame=show_sqltruevproperty n ame=format_sqltruev/property v!-指定映射描述文件-vmapp ingresource=org/tare na/en tity/Cost.hbm.xml / v/sessi on-
14、factoryv/hiber nate-c on figurati on届性名dialect頂定眾揺專龙方言虽然各称荽焉互豁抬SQL恬 准,但不同的額揭所实现的SQL语句賂有不同1所 :冒逛库菟方言応垠JE所柔用城库的不同设置不同 笼方言类.取如:org.hibernate.dialect.Oracle9Dialectf 针Orade ) org.hibernate.dialect.1,1 y SQLDiaied: WT MySQL) org.hibernate.dtalect.SQLSefv&rDialect (针 77 SQLServer Jco nnection.d nvess瓏琳玮JD
15、BC返就黄connection url艇 JDBC荷库的URLcon nm di on. u 占 mm 吕 mg區進接数据.芽的用户名connection passrdShow_sc|可选鑫取.如黒设置为i true r则tibernate将U 日586W式箱岀执行的SQL皓句r用亍瞬遍层 hibemateKji r 冥獸认道为 false,rF ormat_sqi可选参数.如頁设置尢true r贝hibernate蛊二 SQL语句对逛権m 按照舍理分行印缩斗疋式亘亍 SQL :訖,妇罠为false则不程淫梧式舅生认週力 -false-注意事项:应该放在源文件的 src目录下,默认 为hibe
16、rnate.cfg.xm。文件内容是 Hibernate工作时 必须用到的基础信息。step4:编写Entity实体类(也叫POJO类),例如:资 费实体类Costprivate Integer id; /资费 IDprivate StrincfeeName; /资费名称private Integer baseDuration; /基本时长 private Float baseCost; /基本定费private Float un itCos t; / 单位费用privateString status; 0:开通;1 暂停;private String descr; /资费信息说明privat
17、eDate createTime; 创建日期private Date startTime; / 启用日期privateStri ng costType; / 资费类型getter/setter 方法注意事项:POJO类表示普通类(Plain Ordinary Old Object),没有格式的类,只有属性和对应的 getter/setter方法,而没有任何业务逻辑方法的类。这种类最多再加入 equals() hashCode(、toString() 等重写父类Object的方法。不承担任何实现业务 逻辑的责任。step5:编写hbm.xml映射(文件)描述信息:映射文 件用于指明POJO类和表
18、之间的映射关系(xx属性对 应xx字段),一个类对应一个映射文件。例如:Cost.hbm.xml 内容如下:!- -!- 表明此为主键列,且必须写否则 xml报错,主键映射-!- 或双标签 -vparamname=sequenceCOST_SEQ_CHANG v/ge neratorvpropertyn ame= nametype=java.la ng.Stri ng vcolumn name=NAME /vpropertyn ame=baseDurati ontype=java.la ng.l nteger-WORD格式-专业资料-可编辑-vcolu mn name=BASE_DURATIO
19、N / v/propertyvpropertyn ame=baseCosttype=javaa ng.Float vpropertyn ame=startTimetype=java.sql.Datevcolumn name=STARTIME / ,主键歹U同理!-其他省略v/hibernate-mappi ng注意事项:映射文件默认与POJO类放在一起;命名规则 为:类名.hbm.xm。hbm.xml中已写出的属性与字段的映射要对应,若表中没有某个字段,却写了映射关系,则报错:找不到实体类。step6:利用 Hibernate API 实现 DAO1)新建HibernateUtil类,用于圭寸
20、装创建 Session的方 法。如下:每个用户会对应一个Session但是Sessi on Factor是共享的。public class Hiber nateUtil private static Session Factory sf;static不用每次都加载配置信息,所以放 static 块中,否则每次都加载会耗费资源Configuration conf=new Configuration();/ 加载 主配置 hibernate.cfg.xmlconf.con figure(/hiber nate.cfg.xml);sf=c on f.buildSessi on Factory。;/获
21、 取Session Factorypublic static Session getSession()获取 Session Sessi on sessi on =sf.ope nSessi on(); retur n sessi on; 2) 新建 CostDAO 接口public Cost fin dByld(i nt id);public voidsave(Cost cost);public void delete(i nt id); public void update(Cos cost);public List fin dAll();3) 新建CostDAOImpl类,用于实现Cost
22、DAO接口 public class CostDAOImpl impleme nts CostDAO private Sessi on sessi on;public CostDAOImpl () / 不想老写获得 session 的方法,就写在构造器中sessi on=Hiber nateUtil.getSessi on();/* get方法执行查询,按主键当条件查询,如何判 断是主键,是根据写的描述文件来定,get方法就是fin dByld,就是按主键去查,需指定:操作哪个类和 id(主键)条件值即可,其他条件查询做不了*/public Cost fin dById(i nt id) /S
23、essi on sessi on=HibernateUtil.getSessi on ();id);Costcost=(Cost)sessi on .get(Cost.class,sessi on. close(); retur n cos t;/* save方法执行增加操作,注意 1获取事务并开 启,增删改要注意,查询可以不管事务,因为没对数 据库进行修改;注意 2:主键值根据hbm.xml中的定义生成,执行后,会先获取序列值,再 去做insert操作。即先:select COST_SEQ_CHANG.nextval from dual: 然后:insert into */public vo
24、id save(Cost cost) /Sessi on sessi on=HibernateUtil.getSessi on ();Tran sactio ntx=sessi on .begi nTran sactio n();/打开 事务sessi on. save(cost);mit();/ 提交事务session.close();释放/* delete方法执行删除操作,由于Hibernate以“对 象”为单位进行数据库操作,所以这里要传进去一个 对象,虽然是个对象,但还是按主键做条件删除,只 要把主键值设置上就行,其他非主键值不用管。也可 先通过id查再删*/public void d
25、elete(i nt id) /Sessi on sessi on=HibernateUtil.getSessio n();Transaction tx=session.beginTransaction(); Cost cost=new Cost();cost.setId(id);sessi on. delete(cost);mit(); sessi on. close(); /* update方法执行修改操作,*/public void update(Cost cost) /Sessi on sessi on=HibernateUtil.getSessio n(); Transaction
26、tx=session.beginTransaction(); session.update(cost);将cost对象更新到数据库mit();sessi on. close();/* 特殊查询,SQL 语句:String sql=select * fromCOST_CHANG;HQL 语句:String hql=from Cost; ( Hibernate Query Language是面向对象的查询语句。from后写映射的类名,它是Hibernate中特有的查询 语句,根据映射的类去查询。*/public List fin dAll() /Sessi on sessi on=Hibernat
27、eUtil.getSessi on ();String hql=from Cost;/HQL 语句Query query=sessi on. createQuery(hql);List list=query.list();/ 执行查询,返回 List集合sessi on. close(); return list;4) 新建TestCostDAO类,使用junit测试Testpublic void testFindByld() 当 get 方法没有记录 时,返回nullCostDAO costDao = new CostDAOImpl();Cost cost = costDao.fi ndBy
28、Id(1);st.getBaseDurati on();System.out.pri ntln (cost.getBaseCost();System.out.pri ntl n(cost.getU nitCost();System.out.pri ntln (cost.getDescr();Testpublic void testSave()/id 主键列由 Hibernate 管 理,这里不用设置Cost cost=new Cost(); cost.setName(2013计时);cost.setU nitCost(0.8f); cost.setDescr(计时,0.8元/小时。);cost
29、.setStatus(0); cost.setCreaTime( new Date(System.curre ntTimeMillis();CostDAO costDao = new CostDAOImpl();costDao.save(cost); Testpublic void testUpdate()开通某个资费,把状态 由0变为1CostDAO costDAO=new CostDAOImpl();/*注意事项:更新部分字段,不能和实现类中 的删除那样,做一个对象出来!否则没设置的字段将 被改为空! 即不能:Cost cost=new Cost() cost.setld(90);cost
30、.setStatus(1);cost.setStartTime( neDate(System.currentTimeMillis(); */Cost cost=costDAO.findByld(90); 只能先通过 id找到带有所有值的对象cost.setStatus(1);/然后再对部分字段进行更 新,才能避免把其他字段更新为空cost.setStartTime( newDate(System.curre ntTimeMillis(); costDAO.update(cost);Test public void testDelete()CostDAO costDAO=new CostDAOI
31、mpl(); costDAO.delete(90); Testpublic void testF in dAll()CostDAO costDAO=new CostDAOImpl(); List list=costDAO.fi ndAll();for(Cost c:list) System.out.println(c.getName());2.4 HQL语句(简要介绍)简要介绍见2.3节中step6中的3)特殊查询(本 页最上)。详细介绍见第七章。-WORD 格式 - 专业资料 - 可编辑 -三、数据映射类型hbm.xml 在描述字段和属性映射时,采用 type 属性 来指定映射类型。3.1
32、映射类型的作用主要负责实现属性和字段值之间的相互转化。3.2 type 映射类型的两种写法1)指 定 Java 类 型 , 例 如 : java.lang.String、javaang.lnteger,不能写成 String 2)指定Hibernate类型,例如: 整数: byte、short、integer、long; 浮点数: float、double;字符串: string; 日期和时间:date (只处理年月日),time (只处理时分秒),timestamp (处理年月曰时分秒); 布尔值: true/falsechar(1() 数据库存Y/N ,显示时自动转为 true/false
33、)、 true/falsechar(1() 数据库存 T/F ,显示时 自动转为 true/false)、true/falsev-boolean-bit (数据库存1/0,显示时自动转 为 true/false); 其他:blob (以字节为单位存储大数据)、clob (以字符为单位存储大数据) 、big_decima、l big_integer;注意事项:Hibernate类型都是小写!建议使用Hibernate 类型。-WORD格式-专业资料-可编辑-3) 所以 2.3 节中 step5的 Cost.hbm.xml 内的 type 也 可这样写:vpropertyn ame= name t
34、ype=stri ngvproperty name=baseCost type=floatvproperty name=startTime type=date注意事项:java.util.Date有年月日时分秒毫秒,但如果用 date映射,则只把年月 日存进数据库; java.sql.Date只有年月 日。java.sql.Timestamp有 年月日时分秒毫秒。若在页面显示按特定格式显示则用Struts2标签:HibernateBJSi 类塑对应BJavaS据类型对应的転准SQL字段类型integerirt 或 java lang IntegerINTEGERlongFong 或 lava.
35、iang LengBIG1NTshortshort Etejava lang. ShortSMALLINTfloatfloat 或但va lang FloatFLOATdoubledouble 或 ava lang.DaiibteDOUBLEbig decimaijiava math BigDecimaiNUMERICcharacterjava lang StringCHAR(1)stringjava.lang StringVARCHARbytebytelang ByteT1NYINTbooleanboolean 或java lartg Booleansrryesnobooleanlang B
36、ooleanCHAFyi) ( T or NJ )trw_fa1seboolean alt java lang BooleanCHAR(1) ( T or F )datejava.util.Date 矚的上占ql.Dd怕DATE四、Hibernate主键生成方式Hibernate负责管理主键值。它提供了多种主键生成 方式。4.1五种生成方式1) sequenee可以按指定序列生成主键值。只适用 于Oracle数据库。不担心并发量!例如:vgenerator class=sequence vparam name=sequence序 歹U 名字 v/paramx/ge nerator注意事项:创建
37、序列时如果不指定参数,默认从 1开始,步进是1。2) identity:按数据库自动增长机制生成主键值。一 般适用于MySql、SQLServer数据库。例如:3) native: Hibernate会根据方言类型不同,选择不同的主键生成方式。如果是OracleDialect则会选择sequenee 如果是 MySQLDialect 则会选择 identity。例如: 注意事项:如果是MySql数据库,vparam name=sequenee:序列名字 是不起作用 的,但也不会出错;如果是Oracle数据库,vparam name=sequence序列名字 就会起作 用,所以一般我们会加上这句
38、话,这样通用性更 强。4)assigned Hibernate会放弃主键生成,采用此方 法,需要在程序中指定主键值。例如:vgenerator class=assignedv/generator5)in creme nt: Hibernate 先执行 select max(id) 语句 获取当前主键的最大值,执行加 1操作,然后再调用 insert语句插入。Oracle和MySQL都可用。但不适合并 发量很大的情况!例如:vge nerator class= in creme ntv/ge nerator6) uuid/hilo : uuid:按UUID 算法生成一个主键值 (字符串类型);h
39、ilo :按高低位算法生成一个主键值 (数值类型)。例如:vgenerator class=hilo注意事项:主键一般都是自动生成的。我们一般不使用业 务数据作为主键,因为业务逻辑的改变有可能 会改变主键值。主键生成方式是枚举类型,只能从一个有限的 范围内选择,不能自定义。其中,seque nee是 使用序列生成主键(Oracle数据库经常使用)。五、Hibernate基本特性5.1对象持久性在Hibernate使用过程中,实体对象可以具有以下三 种状态:1) 临时状态:采用new关键字创建的对象,该对象 未与Session发生关联(未调用Session的API)。也叫临时对象。临时状态的对象
40、会被 Java的垃圾回收机制回收。2)持久状态:实体对象与 Sessio n发生关联(调用 了 Session的 get、load、save update等 API)。也叫持 久对象。3)游离状态:原来是持久状态,后来脱离了 Session 的管理。如:Session被关闭,对象将从持久状态变为游离状态,同时垃圾回收机制可以回收掉,不再占用 缓存空间了。5.2处于持久状态的对象具有的特点1)对象生命期持久,垃圾回收机制不能回收。2) 对象的数据可以与数据库同步(即对象中的数据 发生改变,则数据库中的数据自动同步)。由Session 对象负责管理和同步。3)对象在Session的一级缓存中存放(
41、或者说在 Session存中的对象都是持久对象)。注意事项:Sessio n.close有两个作用:关闭连 接、释放资源使对象变为游离状态,当对象的引用不存在时,对象才被回收。没被回收时,对 象中的数据还在!5.3三种状态下的对象的转换Transientgeto : IcsdQ findQ iterate Q ftc.javeQsaveOrUpdateOPersistentevictT closeQ * clearfl * deleteQi updateQ saveOrUpdateQ lockQgarbagegarbageDetached* affects all instances in a
42、 Session5.4批量操作:注意及时清除缓存Tran sacti on tx = sessi on .begi nTran sacti on(); for(i nt i=0;i100000;i+) Foo foo = new Foo();session.save(foo);/设置 foo 属性 if(i%50=0)够50个对象,与数据库同步下,并清除缓存sessi on .flush(); 同步 sessi on. clear();/清 除缓存 mit();5.5案例:三种状态下的对象使用当持久对象数据改变后,调用sessio n.flush方法,会与数据库同步更新。commit()方法,
43、内部也调用了 flush(方法,因此使用 commit()方法可以省略flush()方法的调用。Testpublic void test1()/Foo 实体有 id、name salary hireDate marry等属性Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 1);/fo唄有持 久性foo.setName(cha ng); foo.setSalary(6000);/*提
44、交事务,若后面不写flush,只写提交commit, 则也能执行更新操作。因为 commit在内部会先调用 flush,再提交事务,所以此时flush可不写*/mit();/*触发同步动作,同步和提交是两回事。数据有变 化才同步(更新),没变化不会更新*/session.flush(); session.close();/关闭 session释放 资源 Testpublic void test2()Foo foo=new Foo();foo.setName(tigger); foo.setSalary(8000);foo.setMarry(true); foo.setHireDate (new
45、Date(System.curre ntTimeMillis();Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();sessio n.save(foo);/以上都是临时状态,此时由临 时状态转为持久状态foo.setSalary(IOOOO);/修改foo持久对象的数据, 也是更新操作,可不写update方法mit(); 同步、提交session.close();Testpublic void test3()Sessi onsessi on=Hibernat
46、eUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 2);/fo唄有持 久性sessio n.clear();/下面的则不会与数据库同步了 foo.setName(常);foo.setSalary(8800);mit();/session.flush(); 数据有变化才同步update,没变化不会 updatesessi on. close();5.6 一级缓存机制(默认开启)一级缓存被称为 Session级别的缓存:每个 Sessi
47、on 都有自己独立的缓存区,该缓存区随着Sessior创建而开辟(由 SessionFactor创建),随着 Session .close而释 放。该缓存区可以存储当前Sessio咲联的持久对象。只 有在缓存区中,Session才管该对象。5.7 一级缓存的好处Hibernate在查询时,先去缓存当中查找,如果缓存中没有,才去数据库查询。如果利用Session对同一个对象查询多次,第一次去数据库查,后续的会从缓存 查询,从而减少了与数据库的交互次数。5.8管理一级缓存的方法1) session.evict方法:将对象清除。2) session.clear方法:清除所有对象。3) session
48、.close方法:清除所有对象,并关闭与数 据库的连接。注意事项:不同的session的缓存区不能交叉访 问。4) 案例:测试一级缓存Testpublic void test1()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第 一次查 询System.out.println(foo1.getName();/能出现 SQL 查询语句Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 续查询System.out.println(fo
49、o2.getSalary();不能出现 SQL 查询语句sessi on. close();Testpublic void test2()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第一次查 询System.out.println(foo1.getName();/能出现 SQL 查询语句session.evict(foo1);/ 或 session.clear(foo1);Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 续查询 System.out.println(foo2.getSalary();能出现 SQ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 总经理年会致辞(集合15篇)
- 养老保险知识
- 数据中心运维服务投标方案(技术标)
- 市场监管案件审核培训
- 初级会计实务-初级会计《初级会计实务》模拟试卷479
- 智研咨询-2024年中国消化类药物行业市场全景调查、投资策略研究报告
- 子空间估计在超短基线干扰抑制中的应用
- 恐怖袭击应急管理
- 基于转录组测序技术探讨陇中消肿止痛合剂对脊髓损伤星形胶质细胞来源外泌体miRNAs作用机制研究
- 年产 30 万吨合成氨转变工序设计
- 2024-2025学年山东省潍坊市高一上册1月期末考试数学检测试题(附解析)
- 江苏省扬州市蒋王小学2023~2024年五年级上学期英语期末试卷(含答案无听力原文无音频)
- 数学-湖南省新高考教学教研联盟(长郡二十校联盟)2024-2025学年2025届高三上学期第一次预热演练试题和答案
- 决胜中层:中层管理者的九项修炼-记录
- 幼儿园人民币启蒙教育方案
- 临床药师进修汇报课件
- 北京市首都师大附中2025届数学高三第一学期期末达标测试试题含解析
- 军事理论(2024年版)学习通超星期末考试答案章节答案2024年
- 《无人机法律法规知识》课件-第1章 民用航空法概述
- 政治丨广东省2025届高中毕业班8月第一次调研考试广东一调政治试卷及答案
- 2020-2024年安徽省初中学业水平考试中考物理试卷(5年真题+答案解析)
评论
0/150
提交评论