超级全马士兵hibernate学习笔记版_第1页
超级全马士兵hibernate学习笔记版_第2页
超级全马士兵hibernate学习笔记版_第3页
超级全马士兵hibernate学习笔记版_第4页
超级全马士兵hibernate学习笔记版_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程内 Hibernate原理模拟-什么是O/RMap以及为什么要有O/RMap.................................常见的0/R框架(了解 hibernate基础配置(重点 ID生成策略(重点 Hibernate开发接口介绍(重点 对象的三种状态(了解 关系映射(重点 性能优化(重点 补充话 风 先脉络,后细 先操作,后原 资 . 文 hibernateannotation 环境准 注意阅读hibernatecompatibilitymatrix(hibernate slf4jl.5.8 Hibernate 建立新java项目,名为hibernate_0100_ 引入mysql的JDBC驱动 在mysql中建立对应的数据库以及 建立hibernate配置文件 建立Student 建立Student映射文件 将映射文件加入到hibernate.cfg.xml 写测试类Main,在Main中对Student对象进行直接的测 建立能 建立Annotation版本的 创建teacher表,createtableteacher(idintprimarykey,namevarhcar(20),title 创建Teacher 在hibernatelib中加入annotation的jar 在hibernate.cfg.xml中建立映射<mapclass:.../ 参考文裆进试(注意文裆中缺少configure()的小 FAQ:@不给提 WhatisandWhy0/RMap..................................................................................................................... 可以在对象和关系表之间建立关联来简化编 0/R 简化编 0/R 数据库平 0/RMap Hibernate基础配 对应项目 hibernate.cfg.xml: 搭建日志环境并配置显示DDL语 搭建jUnit环 表名和类名不同,对表名进行配 字段名和属性相 字段名和属性名不 映射日期与时间类型,指定时间精 映射枚举类型(比较少用 字段映射的位置(field或者get方法 课外:CLOBBLOB类型的数据存 hibernate类 ID生成策 对应项目 注意 xml生成 注解方式 联合主 幵发接口介 HibernateAPI文档需要单独................................................................................................. SchemaExport(自动建表 Query接 三种对象状 上一个 三种状态的区分关键在 三种状态 改变属性 关系映射(重要 对象之间的关 象之间处 简化问题 —对 —对 组件映 一对一关 一对一单向外键关 一对一双向外键关 一对一单向主键关联(不重要 一对一双向主键关联(不重要 联合主 组件映 项目 对象关系:一个对象是另外一个对象的一部 数据库表:一张 annotation:@Embeddable xml:使用<component,例 多对一与一对 多对一单向关 一对多单向关 一对多(多对一)双向关 多对 单向关联 双向关联 关联关系中的 cascade仅仅是帮我们省了编程的麻烦而已,它的作用看的太 铁律:双向关系在程序中要设定双向关 铁律:双向 O/RMap编程模 数 练习:多对多的 关系映射总 什么样的关系,设计什么样的表,进行什么样的映 集合映射(不太重要 项目名称:hibernate_1800_Collections_Map........................................................................ List(与Set差不多多个 继承映射(不太重要 三种方 作 设计 树状结构的设计(至关重要 Hibernate查询(Query HQLvs NativeSQL>HQL.>EJBQL(JPQL1.0)>QBC(QueryByCriteria)>QBE(QueryByExample)"总结:QL应该和导航关系结合,共同为査询提供服务 性能优 1+N问题(典型的面试题)(详见hibernate_2800_Hibernate_1+N项目 list和iterate不同之处(//主要为了面试详见 课程内 Hibernate原理模拟-什么是O/RMap以及为什么要有O/R0/RID(Hibernate开发接口介绍(重点对象的三种状态(了解关系映射(重点性能优化(重点风hibernate–资 . hibernateannotation环境准 注意阅读hibernatecompatibilitymatrix(hibernate slf4jl.5.8Hibernate建立新java项目,名为hibernate_0100_项目右键-buildpath-configurebuildpath-addUser-librarylibraray,hibernateslf-nopcreatedatabaseusecreatetableStudent(idintprimarykey,namevarchar(20),agehibernateStudentStudent写测试类Main,在Main中对Student对象进行直接的测newConfiguration().configure().buildSessionFactory(),而不是要省略configure,否则会出hibernatedialectmustbeset的异常主动学习,砍弃接受灌输的习惯错完建立Annotation版本的teacher,createtableteacher(idintprimarykey,namevarhcar(20),titleTeacherhibernatelibannotationjarhibernateannotaionejb3persistencehibernatecommon-注意文裆中没有提 mon-annotations.jar文在hibernate.cfg.xml中建立映射<mapclass:.../参考文裆进试(注意文裆中缺少configure()的小FAQ:@eclipsecontentassist-activation--加上WhatisandWhy0/R0/RMap简化编0/R Hibernate_0200_OR_Map0/RMapa)意愿统一天下Hibernate基础配hibernate.cfg.xml:hbni2ddl.auto:create、updateDDLslf4j-log4j.jar,log4jjar包,slf4-从 copyhibernatejUnit SQL SQLSQL格式化显示输出sql<property表名和类名不同,Annotation:@Table不用写@column与默认的@BasicXmlAnnotation:xml: xmlAnnotation:@Temporal(参数3,只显示日期,//@Temporal(TemporalType.DATE)//@Temporal(TemporalType.TIME)//@Temporal(TemporalType.TIMESTAMP)xml:<classname="Teacher"table="Teacher"<idname="id"<propertyname="name"type="time"映射枚举类型比较少用@Enumerated(EnumType.ORDINAL枚举类型按位置数,如:0,1,2@Enumerated(EnumType.STRING)枚举类型按设定值xml:字段映射的位置(fieldget方法bestpracticefield(变量定义getset课外:CLOBBLOBhibernate对应项目等xml<idname="id"<generator常用四个:nativeidentitysequence注解方式AUTO(直接写@GeneratedValuenative)MySQL,Oraclehibernate_sequence(名称固定//在@GeneratedValuegenerator="teacherSEQ"//"teacherSEQ_DB"Sequence名@SequenceGenerator(name="teacherSEQsequenceName="teacherSEQ_DB")publicintgetId(){return}TABLE pkColumnName="keyvalue",pkColumnValue="pk //pkColumnValue //pkColumnValue)@GeneratedValue(strategy=GenerationType.TABLE,generator="teacherIDuuid@GenericGenerator(name="teacherUUID",JunitHibernateSessionFactoryXmlcomposite-pojo(pojoid,namepublicclassStudentPKimplementsSerializable{privateStringid;privateString…pojojava.io.Serializable序列化接publicbooleanequals(Objecto){if(oinstanceofStudentPk)StudentPkpk=if(this.id==pk.getId()&&.equals(pk.getName())){returntrue;}}return}publicinthashCode()return}XML<classname="com.bjsxt.pojo.Student"<composite-idname="studentPK"<key-propertyname="id"></key-<key-propertyname="name"></key-<propertyname="age"<propertyname="sex"<propertyname="good"type="yesXmlpojoSerializablehashCode@publicclassTeacherPKimplementsSerializable{privateStringid;privateString…publicclassTeacherprivateTeacherPKteacherPK;publicTeacherPKgetTeacherPK(){returnteacherPK;}…方法2:@EmbeddedlD(*)新pojo类无需加注解,只需在原pojo类新属性“TercherPK”的方法前写@EmbeddedlD3:@Id@IdClass(*)pojopojoid,name属性保留不变,也无需新增“TercherPK”id,name的get方法前都加@Idpojo类前加publicclassTeacher{privateStringid;privateStringname;publicStringgetId(){returnid;}publicStringgetName(){returnname;}...幵发接口介HibernateAPI文档需要单只去关注一个方法即关注两个方法即:openSessionopensessionxml<propertycurrent_session_context_classjta、threadmanaged、custom.Classa)threadconnectionb)jta(全称javatransactionapi)-java分布式事务管理(多数据库jta(jbossWebLogic,tomcat管理一个数据库的任务单元(方法 Students1=(Student)session.load(Student.class, Students1=(Student)session.get(Student.class,getload(面试重点,原理load返回的是对象,等到真正用到对象的内容时才发出sql语 xml设定property的update属性,annotation设定@Column的属性,不过这种方式很少用,因为不灵活(忘记xmldynamic-update,JPA1.0Annotation,hibernatei.sessionsessionmerge()(不重要)c)使用HQL(EjBQL)(建议) clear方 clear()session 例如:session.setFlushMode(FlushMode.AUTO)SchemaExportnewSchemaExport(newAnnotationConfiguration().configure()).create(false,Query比如savepersist的区merge、evict等方iii.比如refresh、lock三种对象状在内存中有没有(sessionpersistent:内存中有,缓存中有,数据库有关系映射(重要对象之间的CRUD单向(主键、外键双向(主键、外键@一对一关项目名称Annotation:get@0ne20ne@JoinColumn(name="wifeid")指定生成的数据库字段名publicWifegetWife(){return}xml:xml<many-to-one<class<id<generator<property<many-to-onename="student"column="studentId"项目名称Annotation:@0ne20ne(mappedBy=WifeHusband@OneToOne(mappedBy="wifemappedBy作用HusbandwifegetWifepublicHusbandgetHusband()return}Wife@JoinColumn(name="wifeid")指定生成的数据库字段名publicWifegetWife(){return}xml:many-to-oneunique<one-to-oneproperty-StudentStuIdCardStuIdCardStudent<many-to-onename="student"column="studentId"unique="true"></many-to-<one-to-onename="stuIdCard"property-ref="student"></one-to-其中property-ref相当于此方式生成的StuIdCard表中包含studentid字段作为fk外键,Student特别说明:一对一单向外键关联与一对一双向外键关联在数据库的表的格式是一样的,区别在于javaHibernate在两个类间互相调用彼此,而单向外键关联只能单方一对一单向主键关联(不重要,忘记xml:one-to-oneidforeign一对一双向主键关联(不重要,忘记xml:one-to-oneidforeignclass和<one-to-oneproperty- WifeID若想要指定生成的外键名则需使用@JoinColumns注解,如下:@JoinColumns({@JoinColumn(name="wifeid",referencedColumnName="id"),@JoinColumn(name="wifename",referencedColumnName="name")referencedColumnName*/publicWifegetWife(){……}组件映项目 对象关系:一个对象是另外一个对象的一部annotation:@Embeddable@Embedded表明该对象是从别的位置嵌入过来的,是不需要单独映射的表.这种方式生成的表为husband(id,name,wifename,wifeage),wife表.PublicWift}如:Husband与Wife两个类中都有name字段,这样在生成表的时候会有,此时采用@AttributeOverride注解可以指定Wife类中的name属性对应新的字段名—“wifename”,不过@AttributeOverride注解不常用,因为有更好的解决方法.1:不要在组件的两个映射类中写同名属性;2:如果真的有重复,那么可以在分类中publicStringgetName()return}publicclassWife{…xml:使用<component,例如<classname="Husband"<id<generator<property<component<property <property多对一与一name1name11121earn2eataannotaion:@ManyToOneUserGroup@JoinColumn(name="groupid指定User表中生成与GrouppublicGroupgetGroup()return}<many-to-onename="group"column="groupId"user(id,name,groupid),t_group(id,groupname)<many-to-onename="group"column="groupid"取值在时User时,设置了cascade="all"会自动相应的t_group.而不用管user关联的对象(通常情况下会优先关联的对象,然后再user).Set<User>users=newHashSet<User>();Group端users //GroupUser是多的一方@JoinColumn(name="groupid")//指定User表中生成与GrouppublicSet<User> xml:<setXML<classname="com.hibernate.Group"<id<generator<property<set <keycolumn="groupId"/> <one-to-many一对多(多对一)关系模型(group一对多user)Set<User>users=newUsergroupGroup端配置时,usersmappedBy="groupid"XMLGroup<set<key<one-to-many<many-to-onename="group"务必确保在多的一端生成的生成的外键和一的一方生成的外键的名字相同,项目关系模型(TeacheStudent),Teacherstudents.Set<Student>students=newTeacher类中写:privateSet<Student>students=new )publicSet<Student><class<id<generator

<property<setname="studentstable="t_s">table <key <many-to-manyclass="com.xxx.Student"关系模型(TeacheStudent)Set<Student>students=newHashSet<Student>()Set<Teacher>teachers=newHashSet<Teacher>(); Studentteachers注意:mappedBy@JoinTableXML配置方式:两端配置一样,<setname="students"<key<many-to-manyclass="com.xxx.Student"Student<setname="teachers"<key<many-to-manyclass="com.xxx.Teacher"关联关系中的CRUD_Cascade_FetchrefreshAB CascadealloperationsMERGECascademergeoperation合并(merge=save+update)PERSISTCascadepersistoperationpersist()REFRESHCascaderefreshoperationREMOVECascaderemoveoperationfetchLazyeager,特殊情况(多方数量不cascade={CascadeType.ALL控制增删改(即CUD)fetch=FetchType.EAGER//控制查询(即R)EAGERLAZY//多的一方fetch取值默认为LAZY一的一方默认为)另外:如果User类(即多的一方)中设置fetch=FetchType.LAZYGroup)的对象值的时候类似延迟加载即需要在commit();之前session还存在时调用如:Useruser=如果user改变在commit()Updateuser与groupUserUseruser=(User)session.get(User.class,1);Sessionsession2=sessionFactory.getCurrentSession();Useruser=(User)session.load(User.class,1);(UserGroup)中的“多”的一方(User类userusergroupgroup的userUseruser=(User)session.load(User.class,1);(Group类)3种方式(userGroupgroup= for(Useruser O/RMap编程模jpaannotation(java提供的annotation配置--常用hibernateannotationextension(Hibernateannotation配置--较少用hibernatexml(Hibernate的xml配置方式--常用jpaxml(javaxml配置--较少用关系映射总ListSet继承映射(不太重要 hibernate_1900_lnheritence_Maphibernate_2000_lnheritence_Maphibernate_2100_lnheritence_Mappublic 作业使用联合主键Serializable不使用联合主键(中实际例子采用此类方法注:自己的项目与马老的方式不同,但可实现同样的功能(除从学生查课程外),实体类(表导航(编程方便树状结构的设计(至关重要关系模型Tree(intid,Stringname,Treeparent,Listchildren)多privateList<Tree>childrennewArrayList<Tree>();publicintreturn}publicTreegetParent(){return}可省略即为//EAGERfetch=FetchType.EAGER)publicList<Tree>getChildren(){returnchildren;}Hibernate查询(QueryHQLvsNativeSQL>HQL.>EJBQL(JPQL1.0)>QBC(QueryByCriteria)>QBE(QueryBy总结:QL应该和导航关系结合,共同为査询提供服务性能优另外一种形式的内存(//面试题:Java有内存泄漏吗?语法级别没有但是可由java引起,例如:连接池不关闭,或io后不关闭)1+N(典型的面试题hibernate_2800_Hibernate_1+N项目//fetch=FetchType.LAZY解决N+1//当多对一(@ManyToOne)已经设定属性fetch=FetchType.LAZY//@BatchSize解决N+1join//joinfetch解决N+1//修改hql语句为--"fromTopictleftjoinfetcht.categoryc"//QBC(QueryByCriteria)解决N+1list和iterate不同之处(//listiteratesessionI什么是二级缓存,SessionFactory级别的缓存,可以session存hibernate.cfg.xmlname=@Cache注解(hibernate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论