您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Hibernate培训课程
Hibernate简介——培训讲师:张永军Hibernate的作用解决ORM问题成为ORM第一首选通常用于设计Dao层极大的简化了数据库访问代码良好的数据库可移植性无侵入式的设计,无污染Hibernate在应用程序中的位置JDBCBusinessClasses关系数据库DataClasses持久层组件Hibernate过程及原理设计实体类(POJO)通过注解或者xml文件定义实体类和数据库表的映射关系Hibernate框架根据映射关系定义和数据库配置动态生成SQL语句,通过JDBC来执行SQL语句原理示意Studentt_studentStudent.hbm.xmlsession.save(student)Hibernate工作流程:1.根据类型找到映射文件2.读取映射关系3.根据映射关系生成insert语句4.用student对象的属性值作为Sql参数值5.创建运行PreparedStatement.executeUpdate方法编写第一个Hibernate程序Step1:导入Hiernatejar包Step2:导入jdbc驱动jar包Step3:编写Hibernate配置文件从官方示例程序中拷贝模板文件设置数据库相关配置定义自动生成数据库表定义运行时显示SQL语句指定映射文件propertyname=hibernate.hbm2ddl.autocreate/propertypropertyname=hibernate.show_sqltrue/propertypropertyname=hibernate.format_sqltrue/property编写第一个Hibernate程序编写实体类User{userId,name,birthDate}编写实体映射文件User.hbm.xml必须位于classpath下主键的生成方式处理日期类型映射文件详解编写测试程序初始化配置获取SessionFactory对象并打开Session通过事务插入User对象关闭Session编写第一个Hibernate程序编写工具类HibernateSessionUtil完成Session获取关闭工作通过MyEclipse自动生成HibernateSessionFactory类剖析HibernateSessionFactory类编写第一个Hibernate程序从数据库中取得某个user对象:Session.get方法对该user对象进行修改Session.update方法删除user对象。Session.delete方法update方法vssaveOrUpdate方法实体生命周期实体对象的生命周期有三种状态:Transient(自由状态)实体对象在内在中自由存在,它与数据库中的记录无关联,只是一个普通的Persistent(持久状态)实体对象处于由Hibernate所管理的状态,实体和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。Detached(游离状态)处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于Detached状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。实体状态转换Useruser=newUser();user.setName(“John”);Transactiontx=session.beginTransaction();session.save(user);tx.commit();session.close();Transactiontx2=session2.beginTransaction();session2.update(user);user.setName(“Jonh_2”);tx2.commit();1.此时user对象处于Transient状态。2.此时user对象已经由Hibernate纳入管理容器,处于Persistent状态。3.User对象此时状态为Detached,因为与其关联的session已经关闭。4.此时处于Detached状态的user对象再次借助session2由Hibernate纳入管理容器,恢复Persistent状态。5.由于user对象再次处于Persistent状态,因此其属性的改变将由Hibernate自动固化到数据库中。实体生命周期示例图save()saveOrUpdate()newgarbagedelete()TransientPersistentDetachedgetloaditerateetc.close()*clear()*evict()updatesaveOrUpdatelockgarbage*对session里的所有实体对象都有效VO和PO从实体对象是否被纳入Hibernate实体管理容器的角度,Transient和Detached状态的实体对象可以统称为VO(ValueObject),而被管理的实体对象称为PO(PersistentObject)。两者的区别:1.VO是相对独立的实体对象,处于非管理状态。2.PO是Hibernate纳入其实体管理容器(EntityMap)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。3.如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO。映射文件初探-主键映射idname=propertyName(1)type=typename(2)column=column_name(3)unsaved-value=any|none|null|id_value“(4)generatorclass=generatorClass/(5)/id(1)、name(可选):标识属性的名称。(2)、type(可选):标识Hibernate类型的名字。(3)、column(可选-默认为属性名):对应数据库表的主键字段的名字。(4)、unsaved-value(可选-默认为null):这个值用来判断对象是否要保存。(5)、主键生成方式。主键生成策略assigned主键由应用逻辑产生,数据交由Hibernate保存时,主键值已经设置完成,无需Hibernate干预。hilo通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态seqhilo与hilo类似,通过hilo算法实现主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。increment主键按数值顺序递增。identity采用数据库提供的主键生成机制,如SQLServer,MySQL中的自增长主键生成机制主键生成策略(续)sequence采用数据库提供的sequence机制生成主键,如OracleSequencenative由Hibernate根据数据库适配器中的定义,自动采用identity、hilo、sequence的其中一种作为主键生成方式uuid.hex由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成十六进制数值(编码后以长度为32位的字符串表示)作为主键。利用uuid.hex方式生成主键将提供最好的数据插入性能和数据库平台适应性uuid.String与uuid.hex类似,只是生成的主键不进行编码(长度16位)映射文件初探-属性映射propertyname=propertyName(1)column=column_name(2)type=typename(3)update=true|false(4)insert=true|false(4)formula=“arbitrarySQLexpression”(5)/(1)Name:指定了映射类中的属性名为”propertyName”,此属性将被映射到指定的库表字段。(2)column(可选):指定了库表中对应映射类属性的字段名。(3)type(可选):指定了映射字段的数据类型(4)update,insert(可选-默认为true):表明在用于UPDATE和/或INSERT的SQL语句中是否包含这个字段。(5)formula(可选):一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。定义1对1关联一对一关联包括两种形式:主键关联惟一外键关联1对1主键关联实体定义User{userId:Integer,birthDay:Date,name:String,passport:Passport}Passport{passportId:Integer,serial:String,expiry:Integer,user:User}定义1对1关联-主键关联方式一对一主键关联形式即两张关联表通过主键形式一对一映射关系。Hibernate中,通过one-to-one节点对一对一关系进行定义。典型实例:中国公民只允许拥有一份护照。User.hbm.xmlhibernate-mappingclassname=“com.sino.model.User”table=“t_user”..........propertyname=“name”column=“name”type=“java.lang.String”/..........one-to-onename=“passport”class=“com.sino.model.Passport”cascade=“all”outer-join=“true”//class/hibernate-mappingPassport.hbm.xmlhibernate-mappingclassname=“com.sino.model.Passport”table=“t_passport”idname=“id”column=“id”generatorclass=“foreign”paramname=“property”user/param/generator/idone-to-onename=“user”class=“com.sino.model.User”constrained=“true”/propertyname=“serial”column=“serial”type=“java.lang.String”/propertyname=“expiry”column=“expiry”//class/hibernate-mappingone-to-one详解one-to-onename=propertyName(1)class=ClassName(2)cascade=all|none|save-update|delete(3)constrained=true|false(4)outer-join=true|false|auto(5)property-ref=propertyNameFromAssociatedClass(6)access=field|property|ClassName(7)/1.name:属性的名字[POJO中的]。2.class(可选-默认是通过反射得到的属性类型):被关联的类的名字。3.cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象。4.constrained(约束)(可选)表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schemaexporttool中被使用)。one-to-one详解5.outer-join(外连接)(可选-默认为自动):当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取
本文标题:Hibernate培训课程
链接地址:https://www.777doc.com/doc-958533 .html