,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,目录,Hibernate,简介,Hibernate,基本配置,基本实体类映射,高级实体类映射,HQL,语言,实例设计,课后作业,目录,Hibernate,简介,Hibernate,基本配置,基本实体类映射,高级实体类映射,HQL,语言,实例设计,课后作业,Hibernate,简介,Hibernate,是一个开放源代码的对象关系映射,(ORM),框架,它对,JDBC,进行了非常轻量级的对象封装,使得,Java,程序员可以随心所欲的使用对象编程思维来操纵数据库。,Hibernate,可以应用在任何使用,JDBC,的场合,既可以在,Java,的客户端程序使用,也可以在,Servlet/JSP,的,Web,应用中使用,最具革命意义的是,,Hibernate,可以在应用,EJB,的,Java EE,架构中取代,CMP,(Container-Managed Persistence),,完成数据持久化的重任。,Hibernate,简介,Hibernate,的核心接口一共有,5,个,分别为,:,Session,、,SessionFactory,、,Transaction,、,Query,和,Configuration,。这,5,个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。,Hibernate,简介,Session,接口,:,Session,接口负责执行被持久化对象的,CRUD,操作,(,CRUD,的任务是完成与数据库的交流,包含了很多常见的,SQL,语句。,),。但需要注意的是,Session,对象是非线程安全的。同时,,Hibernate,的,session,不同于,JSP,应用中的,HttpSession,。,这里当使用,session,这个术语时,其实指的是,Hibernate,中的,session,,,而以后会将,HttpSesion,对象称为用户,session,。,Hibernate,简介,SessionFactory,接口,:,SessionFactory,接口负责初始化,Hibernate,。,它充当数据存储源的代理,并负责创建,Session,对象。这里用到了工厂模式。需要注意的是,SessionFactory,并不是轻量级的,因为一般情况下,一个项目通常只需要一个,SessionFactory,就够,当需要操作多个数据库时,可以为每个数据库指定一个,SessionFactory,。,Hibernate,简介,Configuration,接口,:,Configuration,接口负责配置并启动,Hibernate,,,创建,SessionFactory,对象。在,Hibernate,的启动的过程中,,Configuration,类的实例首先定位映射文档位置、读取配置,然后创建,SessionFactory,对象。,Hibernate,简介,Transaction,接口,:,Transaction,接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。,Hibernate,简介,Query,和,Criteria,接口,:,Query,和,Criteria,接口负责执行各种数据库查询。它可以使用,HQL,语言或,SQL,语句两种表达方式。,目录,Hibernate简介,Hibernate,基本配置,基本实体类映射,高级实体类映射,HQL,语言,实例设计,课后作业,Hibernate,基本配置,使用,Java,属性文件加编码方式配置,使用,XML,文件配置,(,hibernate.cfg.xml,),配置,hibernate.cfg.xml,目录,Hibernate简介,Hibernate,基本配置,基本实体类映射,高级实体类映射,HQL,语言,实例设计,课后作业,基本实体类映射,XML,映射文件,映射注释,映射注释,JPA,是,EJB3,规范中负责对象持久化的应用程序编程接口,它定义一系列的注释。这些注释大体可分为:类级别注释、方法级别注释、字段级别注释。给实体类添加适当的注释可以在程序运行时告诉,Hibernate,如何将一个实体类保存到数据库中以及如何将数据以对象的形式从数据库中读取出来。,映射注释,目前有两种注释方案可以确定对象与表格之间的对应关系:一种是注释实体类的属性字段(字段级别注释),成为字段访问方式(,field access mode,);另一种是注释实体类的属性访问方法(方法级别注释),称为属性访问方式(,property access mode,)。,映射注释,注释字段,映射注释,注释,getter,方法,基本映射,Entity,映射实体类,Id,映射生成主键,Table,映射表格,Column,映射表格列,Transient,定义暂态属性,Entity,与,Table,Entity(name=EntityName),必须,name,为可选,对应数据库中一的个表,Table(name=,catalog=,schema=),可选,通常和,Entity,配合使用,只能标注在实体的,class,定义处,表示实体对应的数据库表的信息,name:,可选,表示表的名称,.,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名,catalog:,可选,表示,Catalog,名称,默认为,Catalog().,schema:,可选,表示,Schema,名称,默认为,Schema(“”).,id,id,必须,id,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键,.,置于,getXxxx(),前,.,GeneratedValue(strategy=GenerationType,generator=),可选,strategy:,表示主键生成策略,有,AUTO,INDENTITY,SEQUENCE,和,TABLE 4,种,分别表示让,ORM,框架自动选择,id,根据数据库的,Identity,字段生成,根据数据库表的,Sequence,字段生成,以有根据一个额外的表生成主键,默认为,AUTO,generator:,表示主键生成器的名称,这个属性通常和,ORM,框架相关,例如,Hibernate,可以指定,uuid,等主键生成方式,示例,:,Id,GeneratedValues(strategy=StrategyType.SEQUENCE),public int getPk(),return pk;,Column,Column,可选,Column,描述了数据库表中该字段的详细定义,这对于根据,JPA,注解生成数据库表结构的工具非常有作用.,name:,表示数据库表中该字段的名称,默认情形属性名称一致,nullable:,表示该字段是否允许为,null,默认为,true,unique:,表示该字段是否是唯一标识,默认为,false,length:,表示该字段的大小,仅对 String 类型的字段有效,insertable:,表示在,ORM,框架执行插入操作时,该字段是否应出现 INSETRT 语句中,默认为,true,Column,updateable:,表示在,ORM,框架执行更新操作时,该字段是否应该出现在,UPDATE,语句中,默认为,true.,对于一经创建就不可以更改的字段,该属性非常有用,如对于,birthday,字段.,columnDefinition:,表示该字段在数据库中的实际类型.通常,ORM,框架可以根据属性类型自动判断数据库中字段的类型,但是对于,Date,类型仍无法确定数据库中字段类型究竟是,DATE,TIME,还是,TIMESTAMP.,此外,String,的默认映射类型为,VARCHAR,如果要将,String,类型映射到特定数据库的,BLOB,或,TEXT,字段类型,该属性非常有用.,示例:,Column(name=BIRTH,nullable=false,columnDefinition=DATE),public String getBithday(),return birthday;,Transient,Transient,可选,Transient 表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性.,如果一个属性并非数据库表的字段映射,就务必将其标示为 Transient,否则,ORM 框架默认其注解为 Basic,示例:,/根据 birth 计算出 age 属性,Transient,public int getAge(),return getYear(new Date()-getYear(birth);,目录,Hibernate简介,Hibernate,基本配置,基本实体类映射,高级实体类映射,HQL,语言,实例设计,课后作业,高级,实体类映射,关联类映射,映射集合,关联类映射,ManyToOne,多对一关联(单向或双向),OneToOne,一对一关联(单向或双向),OneToMany,一对多关联(单向或双向),ManyToMany,多对多关联(单向或双向),ManyToOne,ManyToOne(fetch=FetchType,cascade=CascadeType),可选,ManyToOne,表示一个多对一的映射,该注解标注的属性通常是数据库表的外键,optional:,是否允许该字段为,null,该属性应该根据数据库表的外键约束来确定,默认为,true,fetch:,表示抓取策略,默认为,FetchType.EAGER,cascade:,表示默认的级联操作策略,可以指定为,ALL,PERSIST,MERGE,REFRESH,和,REMOVE,中的若干组合,默认为无级联操作,targetEntity:,表示该属性关联的实体类型.该属性通常不必指定,ORM,框架根据属性类型自动判断,targetEntity.,ManyToOne,示例:,/订单 Order 和用户 User 是一个 ManyToOne 的关系,/在 Order 类中定义,ManyToOne(),JoinColumn(name=USER),public User getUser(),return user;,JoinColumn,JoinColumn,可选,JoinColumn,和,Column,类似,介量描述的不是一个简单字段,而一一个关联字段,例如,.,描述一个,ManyToOne,的字段,.,name:,该字段的名称,.,由于,JoinColumn,描述的是一个关联字段,如,ManyToOne,则默认的名称由其关联的实体决定,.,例如,实体,Order,有一个,user,属性来关联实体,User,则,Order,的,user,属性为一个外键,其默认的名