1、马士兵hibernate学习笔记马士兵hibernate学习笔记课程内容6课程内容1HelloWorld62Hibernate原理模拟-什么是O/RMapping以及为什么要有O/RMapping63常见的0/R框架(了解)64hibernate基础配置(重点)65ID生成策略(重点AUTO)66Hibernate核心开发接口介绍(重点)67对象的三种状态(了解)68关系映射(重点)69Hibernate査询(HQL)610在Struts基础上继续完善BBS200611性能优化(重点)612补充话题6风格61先脉络,后细节62先操作,后原理63重Annotation,轻xml配置文件6资源61
2、http:/www.hibernate.org62hibernatezh_CN文档63hibernateannotationreferences6环境准备61下载hibernate-distribution-3.3.2.GA-dist62下载hibernate-annotations-31.4.0.GA63注意阅读hibernatecompatibilitymatrix(hibernate网站download)64下载slf4jl.5.87HibernateHelloWorld71建立新java项目,名为hibernate_0100_HelloWorld72学习建User-library-hi
3、bernate,并加入相应的jar包73引入mysql的JDBC驱动包74在mysql中建立对应的数据库以及表75建立hibernate配置文件hibernate.cfg.xml76建立Student类77建立Student映射文件Student.hbm.xml78将映射文件加入到hibernate.cfg.xml中79写测试类Main,在Main中对Student对象进行直接的存储测试710FAQ:711Note:712建立能力8建立Annotation版本的HelloWorld81创建teacher表,createtableteacher(idintprimarykey,namevarhc
4、ar(20),titlevarchar(lO);82创建Teacher类83在hibernatelib中加入annotation的jar包84参考Annotaion文档建立对应的注解85在hibernate.cfg.xml中建立映射mappingclass:./86参考文裆进行测试(注意文裆中缺少configure()的小bug)87FAQ:不给提示8WhatisandWhy0/RMapping81JDBC操作数据库很繁琐82Sql语句编写并不是面向对象的83可以在对象和关系表之间建立关联来简化编程840/RMapping简化编程850/RMapping跨越数据库平台86Hibernate_0
5、200_OR_Mapping_Simulation80/RMappingFrameworks81hibernate82toplink93jdo94JPA9Hibernate基础配置91对应项目:Hibernate_0300_BasicConfiguration92介绍MSQL的图形化客户端93hibernate.cfg.xml:hbni2ddl.auto94搭建日志环境并配置显示DDL语句95搭建jUnit环境96hibernate.cfg.xml:show_sql97hibernate.cfg.xml:format_sql98表名和类名不同,对表名进行配置99字段名和属性相同910字段名和属
6、性名不同911不需要psersistence的字段(不用列)912映射日期与时间类型,指定时间精度913映射枚举类型(比较少用)1014字段映射的位置(field或者get方法)1015Lob1016课外:CLOBBLOB类型的数据存取1017课外:Hibernate自定义数据类型1018hibernate类型10ID生成策略101对应项目:hibernate_0400_ID102注意:103xml生成id104注解方式:GeneratedValue105FAQ;116联合主键11核心幵发接口介绍131hibernate_0500_CoreAPI132HibernateAPI文档需要单独下载1
7、33Configuration134SessoinFactor135Session136SchemaExport(自动建表)147Query接口148Note:14三种对象状态151上一个project152三种状态的区分关键在于153三种状态:154对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比如改变属性的15关系映射(重要)16对象之间的关系161这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于162简化问题:163对一164对多165组件映射16一对一关联171一对一单向外键关联172一对一双向外键关联173一对一单向
8、主键关联(不重要)184一对一双向主键关联(不重要)185联合主键18组件映射181项目:hibernate_1100_component182对象关系:一个对象是另外一个对象的一部分183数据库表:一张表184annotation:EmbeddableEmbbeded185xml:使用HQL.EJBQL(JPQL1.0)QBC(QueryByCriteria)QBE(QueryByExample)272总结:QL应该和导航关系结合,共同为査询提供服务。27性能优化271注意session.clear()的运用,尤其在不断分页循环的时候2721+N问题(典型的面试题)(详见hibernate_
9、2800_Hibernate_1+N项目)273list和iterate不同之处(/主要为了面试详见hibernate_2900_Hibernate_list_iterate)274一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache)275事务并发处理(面试的意义更大)281HelloWorlda)Xmlb)annotation2Hibernate原理模拟-什么是O/RMapping以及为什么要有O/RMapping3常见的0/R框架(了解)4hibernate基础配置(重点)5ID生成策略(重点AUTO)6Hiberna
10、te核心开发接口介绍(重点)7对象的三种状态(了解)8关系映射(重点)9Hibernate査询(HQL)10在Struts基础上继续完善BBS20011性能优化(重点)12补充话题风格1先脉络,后细节2先操作,后原理3重Annotation,轻xml配置文件a)JPAb)hibernateextension资源1http:/www.hibernate.org2hibernatezh_CN文档3hibernateannotationreferences环境准备1下载hibernate-distribution-3.3.2.GA-dist2下载hibernate-annotations-31.4.
11、0.GA3注意阅读hibernatecompatibilitymatrix(hibernate网站download)4下载slf4jl.5.8HibernateHelloWorld1建立新java项目,名为hibernate_0100_HelloWorld2学习建User-library-hibernate,并加入相应的jar包a)项目右键-buildpath-configurebuildpath-addlibraryb)选择User-library,在其中新建libraray,命名为hibernatec)在该library中加入hibernate所需jar包i.hibernatecoreii
12、./requirediii.slf-nopjar3引入mysql的JDBC驱动包4在mysql中建立对应的数据库以及表a)createdatabasehibernate;b)usehibernate;c)createtableStudent(idintprimarykey,namevarchar(20),ageint);5建立hibernate配置文件hibernate.cfg.xmla)从参考文档中copyb)修改对应的数据库连接c)注释掉暂时用不上的内容6建立Student类7建立Student映射文件Student.hbm.xmla)参考文档8将映射文件加入到hibernate.cfg.
13、xml中a)参考文档9写测试类Main,在Main中对Student对象进行直接的存储测试a)参考文挡10FAQ:a)要调用newConfiguration().configure().buildSessionFactory(),而不是要省略configure,否则会出hibernatedialectmustbeset的异常11Note:a)请务必建立自己动手査文挡的能力b)重要的是:i.要建立自己动手查一手文档的信心ii.还有建立自己动手查一手文档的习惯!iii.主动学习,砍弃被动接受灌输的习惯!12建立能力a)错误读完整b)读昔误的关键行c)排除法d)比较法e)google建立Annota
14、tion版本的HelloWorld1创建teacher表,createtableteacher(idintprimarykey,namevarhcar(20),titlevarchar(lO);2创建Teacher类3在hibernatelib中加入annotation的jar包a)hibernateannotaionjarb)ejb3persistencejarc)hibernatecommon-annotations.jard)注意文裆中没有提到hibernate-common-annotations.jar文件4参考Annotaion文档建立对应的注解5在hibernate.cfg.xm
15、l中建立映射mappingclass:./6参考文裆进行测试(注意文裆中缺少configure()的小bug)7FAQ:不给提示a)配置eclipse属性信息contentassist-activation-加上WhatisandWhy0/RMapping1JDBC操作数据库很繁琐2Sql语句编写并不是面向对象的3可以在对象和关系表之间建立关联来简化编程40/RMapping简化编程50/RMapping跨越数据库平台6Hibernate_0200_OR_Mapping_Simulation0/RMappingFrameworks1hibernate2toplink3jdo4JPAa)意愿统一
16、天下Hibernate基础配置1对应项目:Hibernate_0300_BasicConfiguration2介绍MSQL的图形化客户端3hibernate.cfg.xml:hbni2ddl.auto:create、update。a)先建表还是先建实体类先建表4搭建日志环境并配置显示DDL语句a)slf4j与log4j的关系:slf4j像是一个大管家,可以管理许多的日志框架,log4j是其中之一b)加入slf4j-log4j.jar,加入log4j的jar包,去掉slf4-nop.jarc)从hibernate/project/etc目录copylog4j.propertiesd)査询hibe
17、rnate文裆,日志部分,调整日志的输出策略5搭建jUnit环境a)需要注意jUnit的Bug6hibernate.cfg.xml:show_sql是否输出SQL语句7hibernate.cfg.xml:format_sql格式化SQL语句,美化SQL语句true8表名和类名不同,对表名进行配置a)Annotation:Tableb)xml:自己査询9字段名和属性相同a)不用写column与默认的Basic效果一样b)Xml中不用写column10字段名和属性名不同a)Annotation:Columnb)xml:自己査询11不需要psersistence的字段(不用列)a)Annotatio
18、n:Transient定义不写入数据库,属性透明b)xml不写12映射日期与时间类型,指定时间精度a)Annotation:Temporal(参数)参数有3种只显示时间,只显示日期,时间日期都显示/Temporal(TemporalType.DATE)只显示日期/Temporal(TemporalType.TIME)只显示时间/Temporal(TemporalType.TIMESTAMP)显示日期与时间b)xml:指定type13映射枚举类型(比较少用)a)EnumeratedEnumerated(EnumType.ORDINAL)枚举类型按位置数,如:0,1,2.存储Enumerated(
19、EnumType.STRING)枚举类型按设定值存储b)xml:麻烦14字段映射的位置(field或者get方法)a)bestpractice:保持field(变量定义)和getset方法的一致15Lob16课外:CLOBBLOB类型的数据存取17课外:Hibernate自定义数据类型18hibernate类型ID生成策略1对应项目:hibernate_0400_ID2注意:a)我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射3xml生成ida)generatorb)常用四个:nativeid
20、entitysequenceuuid4注解方式:GeneratedValuea)自定义IDb)AUTO(直接写GeneratedValue相当如native)(GeneratedValue(strategy=GenerationType.AUTO)i.默认:对MySQL,使用auto_incrementii.对Oracle使用hibernate_sequence(名称固定)c)IDENTITY(GeneratedValue(strategy=GenerationType.IDENTITY)d)SEQUENCE(GeneratedValue(strategy=GenerationType.SEQ
21、UENCE)i.SequenceGenerator(可自定义在数据库生成指定的sequence名)Id/在GeneratedValue中增加generator=teacherSEQGeneratedValue(strategy=GenerationType.SEQUENCE,generator=teacherSEQ)/teacherSEQ为SequenceGenerator的标识名/teacherSEQ_DB为指定到数据库生成的Sequence名SequenceGenerator(name=teacherSEQ,sequenceName=teacherSEQ_DB)publicintgetId
22、()returnid;e)TABLE(可以忘记)i.TableGeneratorTableGenerator(name=teacherID,/被调用的TABLE名字table=teacherID_DB,/数据库建立的表名pkColumnName=key_value,pkColumnValue=pk_value,valueColumnName=teacher,/pkColumnValue对应类名allocationSize=1/pkColumnValue对应类名)GeneratedValue(strategy=GenerationType.TABLE,generator=teacherID)注:
23、如果使用注解方式的uuid如下:IdGeneratedValue(generator=teacherUUID)GenericGenerator(name=teacherUUID,strategy=uuid)5FAQ;a)用Junit测试时HibernateSessionFactory初始化异常不提示.疑似一个bugb)用main来做测试6联合主键a)Xml方式:composite-idi.将联合主键的属性提取出来,重新编写一个pojo类(原pojo类中的id,name要删除并新加入属性“StudentPK”)publicclassStudentPKimplementsSerializablep
24、rivateStringid;privateStringname;ii.新建pojo类必须实现java.io.Serializable序列化接口iii.新pojo类要重写equals和hashCode方法Overridepublicbooleanequals(Objecto)if(oinstanceofStudentPk)StudentPkpk=(StudentPk)o;if(this.id=pk.getId()&this.name.equals(pk.getName()returntrue;returnfalse;OverridepublicinthashCode()returnthis.name.hashCode();iv.联合主键生成策略XML配置方法key-propertyname=
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2