hibernate文档(马士兵)

来源:互联网 发布:985优势学科平台 知乎 编辑:程序博客网 时间:2024/06/13 23:43

课程内容          

1.  HelloWorld

A) xml

B) annotation

2.  什么是O/RMapping以及为什么要有O/RMapping

3.  常见的O/R框架

4.  Hibernate基础配置

5.  Hibernate核心接口介绍

6.  对象的三种状态

7.  ID生成策略

8.  关系映射

9.  Hibernate查询(HQL

10.             性能优化

 

 

Hibernate HelloWorld

1.  建立新的java项目,名为:hibernate_HelloWorld

2.  学习建立User-library-hibernaet,并加入相应的jar

A) 项目右键build path-configure build path-add library

B) 选择User-library,在其中新建library,命名为hibernate

C) 在该library中加入hibernate所需jar

Hibernate core

Required

Slf-non.jar

3.  引入mysqlJDBC驱动包

4.  mysql中建立对应的数据库以及表

A) create database hibernate;

B) use hibernate;

C) create table student(id int primary key,name varchar(2),age int);

5.  建立hibernate配置文件hibernate.cfg.xml

A) 从参考文档中copy

B) 修改对应的数据库连接

C) 注释掉暂时用不上的内容

6.  建立Student

7.  建立Student映射文件Student.hbm.xml

A)     参考文档

8.  将映射文件加入到hibernate.cfg.xml

A) 参考文档

9.  写测试类Main,在Main中对Student对象进行直接的存储测试

A) 参考文档

10.             FAQ

A) 要调用new Configuration().configure().buildSessionFactory(),而不是省略configure,否则会出hibernatedialect must be set异常

 

建立Annotation版本的HelloWorld

1.  创建teacher表,create tableteacher(id int primary key,name varchar(20), title varchar(10));

2.  创建Teacher

3.  hibernate lib中加入annotationjar

A) hibernate annotation jar

B) ejb3 persistence jar

C) hibernate common annotations jar

D) 注意文档中没有提到hibernate common annotations jar文件

4.  参考Annotation文档建立对应的注释

5.  hibernate.cfg.xml中建立映射<mappingclass=…/>

6.  参考文档进行测试(注意文档中缺少configure()的小bug

7.  FAQ@不给提示

A) window—preference  contentassist—activation—加上@

 

What is and a Why O/R Mapping

1.  JDBC操作数据库很繁琐

2.  Sql语句编写并不是面向对象的

3.  可以在对象和关系表之间建立关联来简化编程

4.  O/R Mapping简化编程

5.  O/R Mapping跨越数据库平台

 

Hibernate基础配置

1.对应项目:Hibernate _0300_BasicConfiguration

1.  Hibernate.cfg.xml: hbm2dd.auto

A)先建表还是先建实体类

2.搭建日志环境并配置显示DDL语句

3.  Hibernate.cfg.xml: show_sql

4.      Hibernate.cfg.xml: format_sql

5.表名和类名不同,对表名进行配置

A) Annotation@Table

B) Xml:自己查询

6.字段名和属性相同

A) 默认为@Basic

B) Xml中不用写column

7.字段名和属性名不同

A) Annotation@Column

B) Xml:自己查询

8不需要persistence的字段

A) Annotation@Transient

B) Xml不写

9.映射日期与时间类型,指定时间精度

A) Annotation@Temporal

B) Xml:指定type

10.映射枚举类型

A) Annotation@Enumerated

B) Xml:麻烦

11.字段映射的位置(field或者get方法)

    Abest practice:保持fieldget set方法的一致

 

 

 

 

 

 

 

 

 

 

Hibernate映射类型

java类型

标准SQL类型

integer

java.lang.Integer

integer

long

java.lang.Long

bigint

short

java.lang.Short

smallint

float

java.lang.Float

float

double

java.lang.Float

double

big_decimal

java.math.BigDecimal

numeric

character

java.lang.String

char(1)

string

java.lang.String

varchar

byte

byte或java.lang.Byte

tinyint

boolean

boolean或java.lang.Boolean  

bit

yes_no    

boolean或java.lang.Boolean

char(1)('Y'/'N')

true_false

boolean或java.lang.Boolean

char(1)('Y'/'N')

date

java.util.Date或java.sql.Date

date

time

java.util.Date或java.sql.Time

time

timestamp

java.util.Date或java.sql.timestamp

timestamp

calendar

java.util.Calendar

timestamp

calendar_date

java.util.Calendar

date

binary

byte[]

varbinary或blob

text

java.lang.String

clob

serializable

java.io.Serializable实例

varbinary或blob

clob

java.sql.Clob

clob

blob

java.sql.Blob

varbinary或blob

class

java.lang.Class

varchar

locale

java.util.Locale

varchar

timezone

java.util.TimeZone

varchar

currency

java.util.Currency

varchar

 

 

 

 

ID 生成策略

1.  对应项目:hibernate_0400_ID

2.  注意:

A) 我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射

3.  Xml生成id

A) generator

B) 常用四个:native  identity sequence  uuid

4@GeneratedValue

A) 自定义ID

BAUTO

   1)默认:对MySQL,使用auto_increment

   2)对Oracle,使用hibernate_sequence(名称固定)

CIDENTITYTeacher3

DSEQUENCETeacher4

  1@SequenceGenerator

ETABLETeacher5

  1@TableGenerator

5.联合主键

A@IdClass

                                            i.             @Embeddable @Id

                                          ii.             @EmbeddeID

                                         iii.             @Id @IdClass

Bxml:composite-id

   1) 为什么要重写equalshasCode

   2)为什么要实现serializable

B) Annotation

                                               i.             @Embeddble @Id

                                              ii.             @EmbeddedID*

                                            iii.             @ Id @IdClass*

 

  核心开发接口介绍

1.  HibernateAPI文档需要单独下载

2.  Configuration

A) AnnotationConfiguration

B) 进行配置信息的管理

C) 用来产生SessionFactory:维护数据库连接池

D) 只需关注一个方法即:buildSessionFactory()

3.  SessionFactory

A) 用来产生和管理Session

B) 通常情况下每个应用只需要一个SessionFactory

C) 除非要访问多个数据库的情况

D) 关注两个方法即:openSession:创建一个新的session   getCurrentSession:获得当前的sesssion,没有则创建一个,在session没有提交前,多次调用getCurrentSession得到的都是同一个session session一旦提交,再调用getCurrentSession得到的就是一个新session,这两个方法不能混用

                                                                 i.              openSession每次都是新的,需要close

                                                                ii.             GetCurrentSession从上下文找,如果有,用旧的,如果没有,创建新的

1.  用途,界定事务边界

2.  事务提交自动close

3.  Current-session_context_class ( jta thread) java transcation APIj

A)     Thread使用connection

B)     Jta是针对分布式事务,由Application Server的支持(Tomcat不行)

 

4.  Session 等同于数据库的连接

A) 管理一个数据库的任务单元

B) 方法

                                                 i.             Save()

                                                ii.             Delete

                                              iii.             Load

                                              iv.             Get

                                                v.             Getload的区别(重点)

1.  不存在对应记录时表现不一样

2.  Load返回的是代理对象,等到真正用到对象的内容时才发出sql语句

3.  Get直接从数据库加载,不会延迟

          Vi. update

1.  用来更新detached对象,更新完成后转为persistent状态

2.  更新transient对象会报错

3.  更新自己设定idtransient对象可以(前提是数据库有对应记录)

4.  P状态的对象只要设定不同字段就会发生更新

5.  更新部分更改的字段

A)      xml设定property标签的upadte属性,annotation设定@Columnupdatable属性,不过这种方式很少用,因为不灵活

B)      使用xml中的dynamic-updateJPA1.0Annotation没有对应的属性,hibernate扩展?

                                                                                               i.            同一个session可以,跨session不行,不过可以用merge()

                   C)使用hql

           vii. saveOrUpdate

           viii. clear方法

1.             无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear方法可以强制清除session缓存

           ix. flush() 方法

1.       可以强制进行从内存到数据库的同步

5.  SchemaExport

6.  Note

A)                 hibernate涉及很多非常非常细节的区别,但在实际应用中用得极少,请大家先享受写项目的乐趣,再来探讨这些细节问题

                                           i.                                                比如savepersist的区别

                                          ii.                                                Mergeevict等方法

                                         iii.                                               比如refreshlock

B)       建议学习的方法:动手实验

 

 

关系映射

对象之间的关系

1.                  这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题

是当对象之间处于下列关系之一时,数据库表该如何映射,编程上该如何对待

2.                                                                                         简化问题

B)                   怎么写Annotaion

C)                   增删改查怎么写

3.                                                                                         一对一单向外键关联

A)                                 Annotation@one2one @joinColumn

B)                                 Xml: <many to one unique

    4.一对一双向外键关联

A)                                                                                        Annotation@one2one (mappedBy)

C)                                 Xml: <many to one unique<one-to-one property-ref

D)                                 规律:凡是双向关联,必设mappedBy

2.  一对一单向主键关联(不重要)

3.  一对一双向主键关联(不重要)

4.  联合主键

@JoinColumns

      组件映射

 

A) 单向(主键,外键)

B) 双向(主键,外键)

C) 中间表

多对一与一对多

1.                               多对一单向关联

A)                                                                                        数据库表设计:在多方加外键

                                  i.                    错误做法:在一方加冗余

 

Personid

Personname

Dreamid

1

Zhangsan

1

1

Zhangsan

2

 

Dreamid

Dreamdescr

1

 

2

 

B)                                                                 Annotation:@Many2One

C)                                                                 Xml:<many-to-one

2.        一对多单向关联

A)                                                                                        类:在一的一方存在多方的集合

B)                                                                                        数据库表同上

C)                                                                                        Annotation:@One2Many

D)                                                                                        Xml:<set<one-to-many

3.        一对多(多对一)双向关联

 

多对多

1.      单向关联:

A) 例如:老师和学生的关系,老师需要知道自己教了哪些学生

B) 数据库:中间表

C) @Many2Many

D) Xml:<many-to-many

                            

 

 

 

                                       

1.  上一个project

2.  三种状态的区分关键在于

A) 有没有ID

B) ID在数据库中有没有

C) ID在内存中有没有(session缓存)

3.  三种状态:

A) transient:内存中一个对象,没有ID,缓存中也没有

B) persistent:内存中有,缓存中有,数据库有(ID

C) detached :内存有,缓存没有,数据库有,ID

4.  对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比如改变属性的值会不会发出update语句?

A) 强烈建议动手实验

B) 进行正常人的思考

C) 绝对不要去背这些东西

5.  调用flush方法可以强制进行从内存到数据库的同步

 

关联关系中的CRUD

1.  设定cascade可以设定在持久化时对于关联对象的操作

2.  Cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看得太大

A) cascade的属性指明做什么操作的时候关联对象是绑在一起的

B) Refresh=A里面需要读B改过之后的数据

3.  规律:双向关系在程序中要设定双向关联

4.  规律:双向一定要设定mappedBy

5.  Fetch

A) 规律:双向不要两边设置Eager(会有多余的查询语句发出)

B) 对多方设置fetch的时候要谨慎,结合具体应用,一般用lazy不用eager,特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)

6.  要想删除或者更新,先做load,除了精确知道ID之外

7.  如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,该记录就变成垃圾数据

8.  如果指定@One2One的属性fetchFetchTypeLAZY,会延迟对于关联对象的加载,不管是load还是get

关系映射总结

1. 什么样的关系,设什么样的表,进行什么样的映射

2. CRUD,按照自然的理解即可

 

集合映射(不太重要)

1.  Set

2.  List

@OrderBy

3.  Map

@MapKey

 

作业:

1. 学生、课程、分数的设计

2. 设计:

A)  实体类(表)

B)  导航(编程方便)

C)  确定了编程方式

3. 树状结构的设计

A)  在同一个类中使用 One2Many和Many2One

 

性能优化

HQLvs EJB QL

1、NativeSQL>HQL>EJB QL>QBC(Query ByCriteria)>QBE(Query By Example)

2、总结:QL应该和导航关系结合,共同为查询提供服务。

性能优化

1、注意 session.clear()的运用,尤其在不断分页循环的时候

         a) 在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象

            b)另外一种形式的内存泄露

21+N问题(当所需数据可以从一个表中取出时,因导航原因导致与该数据有联系的数据被一起取出而出现的,只需发一个SQL便可满足需求,但实际发出了N)

    处理办法:

    a) 将多一边添加LAZY属性,从而使后边的SQL不会主动发出,只有当有调用的时候才会发出后边的SQL语句

  b) 在被动取数据的表中(多那边)实体类上增加BatchSize属性

  c) 在查询的时候用join fetch语句

3list iterate不同之处

    a) list取所有

    b)iterate先取ID,等用到的时候再根据ID来取对象

    c)sessionlist第二次发出,仍会到数据库查询

    d)iterate第二次,首先找session级缓存

4、一级缓存和二级缓存和查询缓存

            a)什么时缓存

               b)什么是一级缓存,session级别的缓存

               c)什么是二级缓存,SessionFactory级别的缓存,可以跨越session而存在

                   适合放置对象

                   i.经常被访问

                   ii.改动不大

                   iii.数量有限

            d)打开二级缓存

                i.hibernate.cfg.xml配置

<propertyname="cache.use_second_level_cache">true</property>

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider

</property>

               ii.注释

原创粉丝点击