版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. MyEclipse 的使用2. 符号不给提示a可以使用快捷键alt + /来进行提示b) 进行 选项设置 window->proferences-> 搜 content assist java中的c) 提示 preference > java editor content assistd)3. 整行的复制、移动a复制整行:按ctrl+alt+T"来复制 当前焦点所在的行b移动整行:按alt+T来移动 当前焦点所在的行4.2. hibernate 调试1 .调试bug:表名不能和 mappedBy= 的名相同2 .如果使用 SchemaExport (cfg)
2、它和 SessionFactory 使用的 Configuration 定不要是同一个 否那么会出现 Duplicate collection role mapping的错误3.4.3.hibernate 经验1 .先建表a在公司中一般先建表b但是在建表的过程中不一定能和实体类中的对应关系对应上,所以可以 通过实体类生成表,来看一下表应给怎么建,然后再去调整表,调整完表后,就可以调整实体类,并构建实体类c现在是做实验一般会让他自动生成,由于实验式不需要对表调优2 .4. PowerDisigner 的使用1 .连接数据库a 一般powerDisigner连接数据库使用 odbc, 但在Powe
3、rdisigner中没有 MySQL的odbc数据源b解决方法:使用jdbc进行连接i . 菜单的 Database->configure connections->connection profiles设置ii .截图视频35 27.56秒视频截图设置截图c设置完成后测试有可能出现错误d解决方法:把mysql的jar导入到系统的classpath下2 .方向工程a 方向工程reverse Engineer Databaseb作用:可以把数据库中的表的关系反向再现c其他的设置问题可以看视频 35 30分钟视频3 .课程内容1 . HelloWorda) Xml的配置b) Annot
4、ation 的配置2 . Hibernate原理模拟-什么是 O/R Mapping以及为什么要有 O/R Mapping3 .常见的O/R框架了解4 . Hibernate根底配置重点5 . Hibernate核心接口介绍重点6 .对象的三种状态了解7 . ID生成策略重点掌握auto8 .关系映射重点9 . Hibernate查询HQL 10 .在Struts根底上继续完善 BBS202111 .性能优化重点12 .补充话题风格1 .先脉络,后细节2 .先操作,后原理3 .重 annotation, 轻 xml 酉己置a) JPAb) Hibernate-extension环境配置导入 h
5、ibernate-distribution 下的 hibernate3.jar导入 hibernate-distributionjpahibernate-jpa-2.0-api-1.0.0.Final.jar导入 hibernate-distributionrequired下的所有 jar配置slf4j的日志环境导入 slf4jslf4j-nop-1.6.1.jar配置log4j的日志环境导入 apache-log4j-1.2.16log4j-1.2.16.jar并且要导入 slf4jslf4j-log4j12-1.6.1-sources.jar配置JUnit导入 junit4.9b2juni
6、t-4.9b2.jar注意版本的兼容性 annotation entitymanager课程内容列表4 . Hibernate 根底配置1 .对应工程:hibernate_0300_BasicConfiguration2 . Mysql的图形化客户端3 . Hibernate.cfg.xml : hbm2ddl.autoa)先建表,然后再创立对象优点:建表以后需要对表进行优化,如果是先建对象就没法对表进行优化啦4 .搭建日志环境并配置显示ddl语句a) 可以使用好几种 日志架构 如:slf4j log4j apache-commons-loggingb) 使用 slf4j 导入 slf4j-a
7、pi-1.6.1.jar 并导入 slf4j-nop-1.6.1.jarc) 使用 10g4j 导入 slf4j-api-1.6.1.ja、10g4j-1.2.16.jar、slf4j-log4j12-1.6.1.jar5 .搭建JUnit环境a)注意 JUnit 的 bugb)只需要导入JUnit下的一个jar包junit-4.9b2.jar6 . Hibernate.cfg.xml :show_sql7 . Hibernate.cfg.xml :format_sql8 .说明和类名不同,对表名m行配置a) Annotation : tableb) Xml table 属性9 .字段名和属性
8、相同a)默认为basicb) Xml中不用写column10 .字段名和属性名不同a) annotation: columnb) Xml 用 column 属性11 .不需要persistence的字段a) annotation: transientb) Xml不写12 .映射日期与时间类型,指定时间精度a) annotation: temporalb) Xml 中使用 type= date time 等13 .映射枚举类型a) Annotation: ©Enumeratedb) Xml麻烦14 .字段映射的位置(field或者get方法)a) Best practice 保持 fi
9、eld 和 get set方法的一致15 . Lob16 .课外:CLOB、BLOB数据类型的存储17 .课外:hibernate自定义数据类型18 . Hibernate 类型5. ID生成策略1 .对应工程:hibernate_0400_ID2 .注意:a)我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还 有自己的扩展,如index等),而是为了明白我们建立什么样的表和实体 类映射3 . Xml 生成 Ida) Generatorb) 常用四个:native identity sequence uuid4 . GeneratedValudea)自定义IDb) AUT
10、Oi. 默认对 mysql 使用 auto_incrementii. 对 oracle 使用 hibernate_sequence(名称固定)c) IDENTITYd) SEQUENCE1. SequenceGeneratore) TABLE1. TableGenerator5 . FAQa)用junit测试时HibernateSessionFactoryW始化异常不提示.疑似一个bug b)用main来测试6 .联合主键a) Xml: composite-idi . 为什么要重写equals()和hashCode()方法,对象使用equals.方 法进行比拟 来区分两个pk不同 同于数据库中
11、的联合主键 两个联 合起来是不同的可以用equals.的返回值来模拟ii .为什么要实现serializable接口由于当转存到虚拟内存中的时候需要序列化对象.b) annotationi. Embedable Idii. EmbeddedIdiii. Id IdClassiv. hibernate3.6貌似和以前的版本有区别6.核心开发接口介绍1. Hibernate_0500_CoreAPI2. HibernateAPI文档需要单独下载3. Configurationa) Configurationb)进行配置信息的治理c)用来产生 SessionFactoryd)可以在configure
12、 () 方法中指定hibernate配置文件e)只需关注一个方法即:builtSesionFactory ()4. SchemaExporta)用来在程序中生成建表语句,这时候不用在hibernat.cfg.xml配 置.hbm2ddl属性b) 使用 SchemaExport的 create("","")方法5. SessionFactorya)用来产生和治理sessionb)通常情况下每个应用只需要一个 SessionFactoryc)除非要访问多个数据库的情况d)注意 getCurrentSession()和 openSession()的区另U ge
13、tCurrentSession(发 示从现有的上下文中找,如果看 Session那么取出用 如果没有那么创立一个 Session . 在调用 session.getTransaction mitg 前 无论用 getCurrentSession(第用多少次得到的都是同一个session但当commit() 之后,得到的就不是同一个session啦.openSession()永远是新建一个 SessiongetCurrentSession()的作用可以在用户操作中来实现同一个事务的处理,即在应用程序中界定事务边界i. openSession()需要 close()ii. getCurrentSe
14、ssion()事务提交 自动 cloaseiii. openSession()和 getCurrentSession()不能混用 如果先用 openSession(得至I一个 session 再用 getCurrentSession(来获得 session 这两个 session不是同一个 session由于 session只是一个接口 openSession(返回的 session 的实现 和 getCurrentSession()返回的 session的实现不同iv.上下文的界定1. Hibernate.current_session_context_classW 四 个取值 jta th
15、read managed custom.Classa) Jta (Java transaction api) 分布式事务治理 用jta进行事务 治理需要效劳器的支持, tomcat现在不支持jboss支持tomcat可以借助第三方类库来提供支持如spring的类库b) Thread表示从当前的线程中找thread使用connection来管理事务c视频:27 7分钟截图e视频:26 22分钟截图6. Sessiona治理一个数据库的任务单元b方法CRUDi. Saveii. Deleteiii. Loadiv. Getv. Get与load的区另1. 不存在对应记录时表现不一样2. Load返
16、回的是代理对象,等到真正用到对象的内容时才发出sql语句3. Get直接从数据库加载,不会延迟vi. Update1 .用来更新detached的对象,更新完成后变为 persistent对象.2 .更新transient对象会报错.3 .更新自己设置id的transient对象可以数据库中用对应记录4 . Persistent状态的对象只要对字段进行设置就会更新由于在事 务提交之前,session会检查缓存中的对象是否发生过修改,如 果发生过修改,就会执行update;但是它更新的仍是所有的字段, 而不是,修改的字段5 .更新局部更改的字段a) Xml 设定 property 标签的 upd
17、ate 属性,annotation 设定 column的updatable属性,不过这种方式很少用,由于不 灵活一般不用b) 使用 xml 中 dynamic-update, jpa 1.0 annotation没有对应的属 性,hibernate扩展?有一个,可以一试老师没做通1. 同一个session可以,跨 session不行,不过可以用 merge3重要.ii.原理:同一个session的情况下,由于是persistent状态, 对象在缓存中也有一个拷贝,对对象的某个字段进行设 置后,在更新的时候,可以对对象的更改字段进行记录, 做到只更新更改的字段;跨 session时,开始是 对象
18、不 是在persistent状态,没法记录那个字段是否被修改啦, 所以也是更新所有的字段.111. Merge的原理:merge会检查那个字段更改啦,但是它确定更改的方法是,先进行一次 select进行比对,然 后再更新只更改的字段.c使用HQLEJBQL语句 建议6.vii. saveOrUpdate()(此方法相当复杂指的是:它会在一些情况下执行save而在另一些情况下执行 update)viii. Find ()已过时ix. Clear()方法1 .无论是get()还是load()都会首先查找缓存(一级缓存),如果 没有,才会到数据库去找,调用clear()方法可以强制去除session
19、 缓存2 . Load () 在同一个session中,如果对同一个数据load两次只 会发出一条select语句(由于第二次数据在缓存中存在);但是 在这两条语句中间 调用clear就会发出两条语句x. Flush ()方法1 .可以强制进行从内存到数据库的同步2 . flushMode 属性可以调用 session 的 setFlushMode () 方法设 置session的flushMode ;这个一般用不着,可以在性能调节是 进行设置xi.c)7. Query接口a) 参考hibernate查询内容b) D8. Note:a) Hibernate中涉及很多非常非常细节的区别,但在实际
20、应用中应的极少, 请大家先享受写工程的乐趣,再来探讨这些问题i. 比方save()和presist()的区别ii. 如 merge()和 evict()的区别iii. 比方 refresh() lock()等iv. SessionFactory的 getCurrentSession(thread和 jta) 等v.b)细节问题参考补充视频c)9. Session的方法和三种状态a) Session的方法和三种状态在一起形成非常复杂的治理学习方法是:在工作中 使用一种方法看能不能到达目的 如果不能到达目的 就用其 他的方法b)这些细节不用记7.三种状态图:(视频28 (12分钟截图)1 .上一个
21、 project2 .三种状态区分的关键在于a)没有idb) Id在数据库中有没有c)在内存中有没有(session缓存)3 .三种状态a) Transient:内存中的一个对象,没Id,缓存中也没有b) Persistent内存中有,缓存中有,数据库中也有有 IDc) Detached内存中有,缓存中没有,数据库中有,有Id4 .对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比方改变属性的值会不会发出update语句?a强烈建议动手实验b进行正常人的思考c绝对不要去背这些东西!背过也不代表你有多牛!5 .调用flush方法可以强制进行从内存到数据库的同步!8.关系
22、映射8.1 对象之间的关系1 .这里的关系映射指的是对象之间的关系, 并不是数据库的关系,本章解决的问 题是当对象之间处于以下关系之一时,数据库该如何映射,编程上该如何对待红 色为重点2 .简化问题a怎么写 annotationb增删改查CRUD怎么写3 . 对'a单向主键,外键b双向主键,外键c中间表很少用4 . 一对多a单向b双向5 .多对一a单向b双向6 .多对多a单向b双向7 .集合映射a) Listb) Setc) Map8 .继承关系不重要a单表b多表c 一张主表,多张子表9 .组件映射a) embeddable b) embedded 10.8.2 一对一关联1 .一对一
23、单向外键关联(unidirectional)a) 工程名称:hibernate_0600_onetoone_uni_fkb)外键连接的地方使用 OneToOne还可以使用 JoinColumn(name=' ") 来设置外键的列名c) JoinColumn还有一些其他的字段可以设置d) Xml 设置 使用 <many-to-one unique='true'> 必须把 unique 设置为 true 才能是一对一的关联2. 一对一双向外键关联(bidirectional)a) 工程名称:hibernate_0700_onetoone_bi_fkb)
24、 Annotation: OneToOne(mappedBy)c)规律:但凡双向外键关联,mappedBy必设;由于在数据库表中没有必要 建立两个外键关联d) Xml 设置:<many-to-one unique> <one-to-one property-ref>e) 如果在两个.hbm.xml文件中都使用<many-to-one unique>结果就是在这 两张中建立两个外键引用,如果只要建立一个外键以用就用 <one-to-one property-ref>其中的property-ref表示与它关联对象中的引用关联的属性3. 一对一单向主键
25、关联(unidirectional)a) 工程名称:hibernate_0800_onetoone_uni_pkb) Annotation: OneToOne PrimaryKeyJoinColumnc) Xml: <one-to-one constrained='true'>d) <generator name="foreign还有一个要设置的就是在这张表上可能外键引用多 个表 所以还要 指明是和那个表的外键关联<paramname="property" > 表名 <param>4. 一对一双向主键关联(
26、bidirectional)a) 工程名称:hibernate_0900_onetoone_bi_pkb) Annotation: OneToOne PrimaryKeyJoinColumnc) xml 设置:<one-to-one property-ref= >其中的 property-ref 表示与它关 联对象中的引用关联的属性5. 一对一很少用(一对一的主键映射用的更少)6. 联合主键的映射annotation: JoinColumns(JoinColumn(name="ADDR_ID, referencedColumnName="ID"), J
27、oinColumn(name="ADDR_ZIP, referencedColumnName="ZIP")一a) 工程 名称: hibernate_1000_onetoone_uni_fk_composite 7.8.3 组件映射1. 工程名称:hibernate_1100_component2. 对象关系:一个对象是另外一个对象的一局部3. 数据库:一张表4. annotation: Embeddable Embedded5.8.4 多对一与一对多1 .多对一单向关联a) 工程名称:hibernate_1200_manytoone_unib)数据库设计:在多方加
28、外键c) annotation: ManyToOne注释在关联属性上d) xml: <many-to-one name=关联属性如: group“ column= "表的字段 名如:groupId>e)形式为:在多的一方一般存在一方类的组件2. 一对多的单向关联a) 工程名称:hibernate_1300_onetomany_unib)类:在一的一方存在多方的集合c)数据库表:在多方加外键d) annotation: OneToManye) xml: <set > <key column="groupId表示:在多方外键字段的名字 /? <
29、;one-to-many class="org.anxinstudio.hibernate.model.User 类彳以这样的写 法 ></set>3. 一对多(多对一)双向关联a) 工程 名称: hibernate_1400_onttomany_manytoone_bib) annotation: OneToMany ManyToOne 在两个都要用c) 一般在一的一方 使用OneToMany (mappedBy= 属性 由于这和表 之间的关系相一致d) xml: <many-to-one> <set> <one-to-many /&
30、gt;</set> 但是这两边 column 属性 的名字必须一致,如果不一致的话,hibernate就会建立两个外键关联4.8.5多对多1 .单向关联a) 工程 名称:hibernate_1500_many2many_unib)例如:老师和学生晟系老师需要知后自己教了那些学生c)数据库:中间表d) ManyToManyJoinTable(name二:joinColumns=JoinColumn(name="teacher_id")inverseJoinColumns=name="studentjd')joinColumns 中 的JoinCo
31、lumn (name=这个 name是弓|用 ManyToMany 所在类的id的那个字段 在中间表中的字段名.e) <many-to-many > <set name="students' table=> <many-to-many class= column=/></set>其中的students表示 这个xml文件所对应的类的一个 属性的名字table表示中间表名 <many-to-many>中的column表示中间表所引用的另一个类主键 在中间表中字段名.2 .双向关联(非常少用)a)老师知道自己教了那些学生
32、,学生也知道教自己的有哪些老师b) 工程名称:hibernate_1600_many2many_bic) ManyToMany根本设置和单向的相同不同的设置就是在另一个类的一个属性上加上 ManyToMany(MappedBy=")d) <many-to-many>这个设置只是在另一个类的hbm.xml文件中加上相同的设置e)3 .4 .6关联关系中的CRUD1 .多对对多CRUDa) 工程 名称:hibernate_1700_one2many_many2one_bi_crudb) Save()在保存的时候 在默认的情况下4存多的一方面对象,而这个对 象引用了一个一的一方
33、的一个 transient对象,这个一的一方的对象不会 自动保存c)但是可以进行设置 ManyToOne (cascade=CascadeType.All?cascade 属性表示级联对一个表的操作会不会对关联的表也进行操作 CascadeType有几个属性ALL表示对所有的crud操作都级联PERSIST 表示只对c级联DELETE表示d级联.REFRESH的情况:有可能 多个连接连接到一个记录有可能在一个连接操作的过程中其他的连接 对记录进行了修改,REFRESH表示当一个连接和数据库进行同步的时 候,是不是也把和他关联的记录进行同步.2 . Cascade只是帮我们减少了编程中的麻烦而已
34、,不要把它的作用看的太大a) Merge= save+update3.铁律:双向的关系在程序中要设置双向的关联,不然就会出问题.a)双向关联如果在一的一方进行操作的话会比拟麻烦,(假设在设置好cascade属性的情况下)如果在一的一方进行操作的话如:group和userb) User user1 = new Use r() user1.setName( "anxin)c) User user2 = new Use r() user2.setName( "anxin)d) Group group = new Group () group.setName(g1);e) grou
35、p.getUsers().add(user1);f) group.getUsers().add(user2);g) group.save();h) 这种情况下 保存的user的group属性是空的 由于你没有设置user到group的引用i)存储的顺序:不管是在多的一方操作还是在一的一方操作都是先保存一的一方 然后再根据设置 是否保存一的一方 然后再根据一的一方的 设置 判定是不是要把一的一方的引用添加到多的一方的字段中j)上面的要使user表中的group字段不是空的要参加以下代码k) userl.setGroup (group);l) userl.setGroup(group); m)4.
36、 铁律:双向的一定要设置 MappedBy5. ManyToOne 在get的时候 如果get()多的一方的一个对象 默认情况下 也把和它关联的一的一方的那个对象给取出来a)但是如果在一的一方进行操作的话不会把多的一方的相关联的数据 取出来 cascade并不会影响retrieve的级联读取b) 设置: OneToMany( fetch= FetchType.EAGER FetchType.LAZY ) 其中LAZY表示不级联读取;EAGER表示级联读取c) fatch治理get load和其他的读取d) ManyToOne 默认的是 EAGER6. 如果在LAZY的情况下在session关闭
37、的情况下再去取关联字段的属性 这样会出错:session已经关闭7. User u = (User) session.load(u.getGroup().getName();a)如果是双向关联 你在两边都设置了FetchType.EAGER这样就会发出两次sql语句 第一次是把user和group同时取出来 第二次由于你在 group中也设置的是EAGER所以在getName()时也会发出一条sql语句 把group中的users属性给取出来;这样就多发了一次sql语句b)结论:在双向的关联中 一般只在一边设置为EAGER而在另一边设置 为LAZY (如果要用EAGER的话)c)在xml中设置
38、为一边为EAGER而另一边为LAZY的方法是在一个 hbm.xml 文件的 <set inverse="true"></set> 设置 inverse 属性 表示自己 为 LAZY8. 在多的一方用EAGER得情况不多但有的情况下也可以应用例如:一个 用户有好几个权限,可以一下把它们取出来不用看的时候再去取;还有一种情况就是:树状结构的设计(至关重要)一般把一的一方设置为EAGER9. 语句 User u = (User) session.load(User.class,1);a) u.serName( user");b) u.getGro
39、up().setName(ggg'");c)这种情况下一定会发出两条 sql语句由于group的name发生了变化 也需要更新10. CascadeType.MERGE表示只有调用merge方法时才有效用法相同的还有REFRESH PERSIST11. 要删除或者更新,先做load ,除了精确的知道ID外12. delete的时候如果两边都设置为 CascadeType.ALL这个组号也会被删除 同时 与这个组相对应的user都被删除啦a这种情况是在设置了 cascaded勺情况下:i. 如果想消除关联关系,先设定他们之间的关系为null如: user.setGroupnul
40、l;再删除记录ii. 还可以使用EJBQL HQL来删除记录iii. 当删除一的一方时,如果不删除多的一方的数据,那些记录也就变成了垃圾数据b13. O/R Mapping 编程模型a映射模型i. jpa annotation 主要用ii. hibernate annotation extensioniii. hibernate xml 会查iv. jpa xmlb编程接口i. jpaii. hibernatec数据查询语言i. HQLii. EJBQLJPQLd14 .15 7作业1 .学生、课程、分数的设计重要a 工程 名称: Hibernate_2300_student_course_s
41、coreb使用联合主键EmbeddedId1. 实现 Serializable 接口c不使用联合主键i.并不存在唯一的一种映射关系d调试bugi.设计好了实体类以后在hibernate自动建表以后 建的表是不对的它默认下 把studentId作为主键;由于 它参考的是你在Student实 体 类 中 中 间 表 的 设 置 joinColumns=JoinColumnname= "studentId"修改方法就是手 动的建score表2 .设计a先设计实体类表设计完实体类表结构也就知道啦b导航可以简化编程c确定编程方式3 .树状结构设计至关重要a) 工程名称:Hiberna
42、te_2200_treeb) 在同一个类中使用 OneToMany和 ManyToOnec) load 的时候可以使用 OneToManyfetch='"FetchType.EAGER"d但当树很大的时候 可以使用ajax后面探讨4 .8.8 关系映射总结1 .什么样的关系,设计什么样的表,进行什么样的映射2 . CRUD,根据自然的理解即可动手测试8.9 集合映射不太重要1. 当你用什么时从数据库中取数据时就把一的一方中的多方的那些记录放在什么样的集合中2. Set3. Lista) 工程名称:hibernate_1800_Collections_mappingb
43、) OrderBy 支持使用任意的字段进行排序c支持排序 当10ad的数据需要进行排序是 可以使用List,d4. Mapa MapKeyname=设置Map中的key对应记录中的那个字段5.8.10继承映射不太重要1 .三种方式a) 一张总表 SINGLE_TABLEi. 工程名称:hibernate_1900_inheritence_Mapping_Single_tableii. 缺乏之处:可能会有较大而冗余iii. 在 父 类 中 使 用Inheritance(strategy=IhheritanceType.SINGLE_TABLE")iv. DiscriminatorCol
44、umn( name="discriminator,discriminatorType="Dic riminatorType.STRING 标识字段:标识这个记录是属于哪个类 的;DicriminatorType.STRING表示 标识字段的数据类型v. DiscriminatorValue( person")表示这个类在标识字段中的标识vi. 在子类中只写DiscriminatorValue( ")不用写id由于id在父类中已 经指定啦b每个类分别一张表 TABLE_PER_CLASSi. 工程名称:hibernate_2000_inheritence_
45、Mapping_Table_Per_Classii. 缺乏之处:每个子类而id号段不能重如果G相同向不用使用iii.iv.v. vi. vii. viii.ix.x. xi. xii. xiii. xiv.xv.xvi.如 Person (父类)Student Teacher 千类)在程序中写 Person=load(student)这样如果id相同就没法加士id生成策略使用tableInheritance(strategy=InheritanceType.TABLE_PER_CLASS)TableGenerator(力£力 name= t_gen ,table="t_ge
46、n_tabl6', pkColumnName="t_pk, valueColumnName="t_value, pkColumnValue="person_pk',initialValue=1, allocationSize=1),GeneratedValue(generator=_gen,strategy="GeneratorType.TABLE 多态查询相当麻烦c) 每个子类一张表 JOINEDi. 工程名称:hibernate_2100_Inheritance_Mapping_JOINEDii. 缺乏之处:必须设置工键映如一 一ii
47、i. Inheritance( strategy=InheritanceType.JOINED)在父类中写iv. 子类中只写Entity其他的什么也不用写d)2.(视频55 2.45截图)9.Hibernate 查询HQL vs EJBQL1.工程名称:Hibernate_2400_QL_12. NativeSQL>HQL> EJBQL > QBC(Query By Criteria)>QBE(Query By Example)a)以上是按功能排列3. 总结:QL应该和导航关系结合,共同为查询提供效劳.4. 有关查询的东西不会的就看工程的源码5. 可以把 查询出来的字段
48、进行封装为一个新的对象VO (value object) DTO(data transfer object6. select t.title, from Topic t join t.category c 为什么不是 Category c. 由于有可能存在多个成员变量(同一个类),需要指明用哪一个成员变量的 连接条件来做连接.7. uniqueResult() 返回一个对象8. 工程名称:Hibernate_2400_QL_29. form Topic t where t.msgs is empty 其中 empty 表示这个集合为空10. is null其中null表示一个不是
49、集合的数据为空11. from Topic t where t.title like %5'% 表示 0-多12. from Topic t where t.title like _5'_ 表示一个字符13. 还可以使用一些函数14. current_date, current_time, current_timestamp表示取出数据库中的日期, 时间, 日期时而在一个次群效劳系统孑可能用到用数据库中的时间同步15. from Topic t where t.createDate < :date 时间比拟 取小于某个时间值的记录16. group by17. havin
50、g18. 在查询的时候,in和exists可能会到达同样的效果,那么就用 exists;由于 exists的执行效率会更好19. update Topic t set t.title = upper(t.tilte)20. delete from Topic t where t.id=21. NamedQueries( NamedQuery(name="topic.selectCertainTopidquery=for m Topic t where t.id = :id")a) NamedQueries表示可以把查询的语句集中的放在程序的外边,当调用 的时候,调用quer
51、y的名字即可b)调用:Query q =session.getNamedQuery (fopic.selectCertainTopic);q.setParameter(id",5);22. NativeSQLa) SQLQuery q = session.createSQLQuery(select * from category limit 2, 4").addEntity(Category.class);23. NamedNaiveQureies( NamedNativeQuery(name= ,query= )24. QBCa) Criteria c = session
52、.createCriteria(Topic.class) /from Topicb)c) .add(Restrictions.gt("id", 2) /greater than =id > 2d) .add(Restrictions.lt("id", 8) /little than = id< 8e) .add(Restrictions.like("title", "t_")f) .createCriteria("categoryH)g) .add(Restrictions.between(&
53、quot;id",3,5)/category.id >= 3 and category.id <=5h) ;i) 第二个createCriteria表示一个连接25. QBEa)缺乏之处:不能查询区间值10.性能优化1. 注意session.clear的运用,尤其在不断分页循环的时候a在一个大集合总进行遍历,遍历 msg,取出其中的含有敏感字样的对象b另外一种形式的内存泄露c面试题:java有内存泄露吗?有:当翻开文件是java调用了 c c再调用操作系统的api如果不手动的关闭文件 c语言使用的内存就不能被收回,造成内存泄露c语言的内存要手动收回2. 1+N问题a) L
54、azyb) BatchSizec) join fetch3. list和iterate不同之处a) list取所有b) iterate先取id,等用到的时候再根据id来取对象c) session中list第二次出发,仍会倒数据库中查询d) iterate第二次,首先找 session级缓存4. 一级缓存和二级缓存和查询缓存a)什么是缓存b)什么是一级缓存,session级别的缓存1. 当使用多线程时,session之间不能相互使用缓存c)什么是二级缓存,SessionFactoryiX别的缓存,可以跨越session存在d)翻开二级缓存i. hibernate.cfg.xml<prope
55、rtyname=' cache.use_second_level_cacK >true</property><propertyname=' vider_class >org.hibernate.cache.EhCacheProvider</proper ty>ii. 一个数据长期的在内存中也是不好的,这样它就没有时机和数据库进行同步iii. 不是对效率要求特别高的工程不需用二级缓存iv. 使用情况1 .不适合于改动非常频繁的类2 .不适合记录特别多的对象3 .适合于经常被使用的,数据量并不大,改动不太频繁的情况4 .比
56、方:用户的权限;组织机构v. Cache 注解:1 .在使用二级缓存的情况下:标记那个类放在二级缓存中vi. 使用二级缓存要导入jar包 ehcache.jare) 10ad默认使用二级缓存,iterate默认使用二级缓存f) list默认往二级缓存加数据,但是查询的时候不使用g)如果要query用二级缓存,需翻开查询缓存i. 查询缓存是依赖于二级缓存的,使用查询缓存必须翻开二级缓存ii. <property name="cache.use_query_cachie>true</property>iii. 调用query的setCachable(true方法指明使用二级缓存iv. session.createQurey ()setCacha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国硅片切割液行业发展态势及需求趋势预测研究报告(2024-2030版)
- 中国男士古龙水市场深度调研与销售模式分析研究报告(2024-2030版)
- 2024年中国四角法兰市场调查研究报告
- 中国焊接材料行业盈利模式及产销趋势预测研究报告(2024-2030版)
- 中国火焰探测器行业未来前景及投资潜力预测研究报告(2024-2030版)
- 中国润滑油抗氧剂行业竞争策略及需求潜力预测研究报告(2024-2030版)
- 课程设计开发主体中公
- 课程设计打印要不要钉
- 施工索赔课程设计
- 电话拨号模拟课程设计
- (高清版)JTGT 5440-2018 公路隧道加固技术规范
- 牙周病学考试模拟题+答案
- 《精神科保护性约束实施及解除专家共识》解读
- 友善教育主题班会省公开课一等奖全国示范课微课金奖课件
- 医院岗前法律法规培训
- MOOC 机械原理-西北工业大学 中国大学慕课答案
- 高效的跨部门协作与沟通
- 基于PLC饮用水源初处理控制系统设计
- 贫血及低蛋白血症的护理
- 人教版(2019)选择性必修第三册Unit 1 Art 词形变化课件
- 中职学生人生职业规划
评论
0/150
提交评论