Hibernate复习之Hibernate基本介绍

众所周知。眼下流行的面向对象的对象关系映射的Java持久层框架有MyBatis和Hibernate。他们都是对象关系映射ORM。

解决的主要问题就是对象-关系的映射。域模型和关系模型都分别建立在概念模型的基础上。域模型是面向对象的,关系模型是面向关系的,普通情况下。一个持久化类和一个表相应,类的每一个实例相应表中的一条记录。 (可能存在类中多个属性相应一列的情况,映射组成关系), ORM中间件採用元数据来描写叙述对象-关系映射细节,元数据通常采用XML格式。而且存放在专门的对象-关系映射文件里,假设希望把ORM软件集成到自己的Java应用中。用户首先要配置对象-关系映射文件。

Hibernate中也就是entity.hbm.xml,而MyBatis中就是entityMapper.xml 。


以下主要介绍一下Hibernate的运行过程:

session.save(customer)

运行过程: 
1)运用反射机制,获得customer对象的类型Customer.class(类对象)。
2)參考对象-关系映射元数据。了解Customer类相应的表,以及属性相应的列,Customer类和其它类关系。 
3)依据以上映射信息。生成SQL语句:

insert into tab_customer values(id,name,password,telphone);

4)调用JDBC API,运行以上的SQL语句。



JDBC与Hibernate比較: 

1,JDBC: Java中嵌入SQL。不便于维护 
      Hibernate: 无须编写SQL语句;由Hibernate通过读取映射文件在运行时自己主动生成SQL

save(student)-> insert into customer values(?,?,?);

2,JDBC:查询数据。须要手动封装成对象;保存对象,须要手动插入值 
      Hibernate: 可自己主动实现对象和表中记录的转换 

3,JDBC:查询内存中已存在的对象。改动属性值,均须要和数据库进行交互 
      Hibernate:通过Dirty checking(脏检查)避免交互;


Hibernate的工作原理: 

1,Hibernate框架依据hibernate.cfg.xml的配置的信息来和数据库进行通信,当然和Spring结合后也能够通过注解来实现。

2,Hibernate框架依据详细的映射文件**.hbm.xml 来保存,更新,删除,查询对象。


Hibernate API —— Hibernate中几个比较重要的类: 

Configuration接口:

Configuration对象用于配置而且启动Hibernate,Hibernate应用通过Configuration实例还指定对象-关系映射文件的位置或者动态配置Hibernate的属性。然后创建SessionFactory实例

Configuration config = new Configuration();
Config.configure();
SessionFactory factory = config.buildSessionFactory();

//也可以写成
SessionFactory factory = new Configuration().configure().buildSessionFactory();

SessionFactory : 

用来构造Session的实例对象,它的特点: 

1)线程安全: 该实例对象何以被多个线程共享 

2)重量级:该实例对象的构造和销毁消耗系统资源,所以一般在应用程序启动的时候就构造实例对象,一般一个数据库相应一个SessionFactory的实例对象。假设要访问多个数据库,就须要创建多个该实例对象。

3)SessionFactory实例对象中维护了一个非常大的缓存,存放了一些提前定义的SQL语句和XML配置文件的信息,另外还维持了一个Hibernate的第二级缓存(缓存了全部Session对象所载入的POJO对象),用来保存在该生命周期中的一些业务对象,可是这个第二级缓存默认是关闭的,必须在xml中手动配置开放。

// 通过SessionFactory获取Session
Session session = factory.openSession();

Session(别名:持久化管理器):

用来对对象的保存,更新,删除和查询 

特点: 
1)线程不安全:要避免同一个Session对象被多个线程共享,一般一个线程相应一个Session 
2)轻量级:能够随意的构造和销毁该实例对象。

3)Session对象中维护了一个缓存,称为Hibernate的第一级缓存(缓存了当前Session对象所载入的那些POJO对象),每一个Session对象都有自己的缓存,Hibernate会自动开启第一级缓存。 


Transaction: 

用来处理事务,事务的启动,提交,回滚

// 开启事务
session.beginTransaction();
···
···
···
// 操作之后,提交事务
session.getTransaction().commit();

Query:

利用HQL语句(Hibernate Query Language)用来查询单个或者多个对象,面向对象的。

Query query = session.createQuery("from Student where studentId=1");
Student s = (Student)query.uniqueResult();

 uniqueResult()的使用场景:

返回唯一结果,当确定返回的实例只有一个或者null时,返回的是一个对象(如Student)


Criteria: 

功能同上。以面向对象的形式和数据库进行复杂的CRUD操作,还适用于动态查询。 

与SQL和HQL的区别是Criteria完全是面向对象的方式,在进行数据查询,将不再看到SQL语句的痕迹。

String condition = "a"; //模糊查询条件为:产品名称中存在字母a
Criteria c = session.createCriteria(Product.class);
c.add(Restrictions.like("name","%"+condition+"%"));

List<Product> ps = c.list();
for(Product p : ps){
    System.out.println(p.getName());
}

 Restrictions:限制、约束


OID:主键 

简单来说:为了在系统中能够找到所需对象,我们需要为每一个对象分配一个唯一的表示号。在关系数据库中我们称之为关键字,而在对象术语中,则叫做对象标识(Object identifier-OID)
在运行时,Hibernate依据OID来维持Java对象和数据库表中记录的相应关系。

为了保证持久化对象的OID的唯一性和不可变性。通常由Hibernate或底层数据库来为OID赋值,能够将OID的setId()方法设置为private类型,以禁止Java应用程序随便改动OID。 


:子元素用来设定标识符生成器 
Hibernate提供了标识符生成器口:net.sf.hibernate.id.IdentifierGenerator,而且提供了非常多内置实现:

net.sf.hibernate.id.IdentityGenerator –缩写名– identity 
net.sf.hibernate.id.IncrementGenerator –缩写名– increment


主键生成方式:

1,increment: 

其生成方式与底层数据库无关。大部分数据库都支持,该方式的实现机制是在当前应用实例中维持一个变量,以保存着当前的最大值。之后每次须要生成主键的时候将此值加1作为主键。其不足之处是当多个线程并发对数据库表进行写操作时。可能出现同样的主键值,发生主键反复的冲突。所以在多线程并发操作的时候不应该使用该方法

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="increment"/>
</id>

2,identity: 
与底层数据库有关,要求数据库支持Identity。如MySQL中auto_increment,SQL Server中的identity。支持的数据库有MySQL,SQL Server,DB2,Sybase,可是不支持oracle,它同一时候支持并发操作


3,assigned: 
主键由外部程序负责生成。无需Hibernate參与。假设要由程序代码来指定主键,就采有这样的方式


4,sequence 
使用序列生成主键,需要底层数据库支持在数据库中建一个序列sequence(如Oracle)

create sequence seq_name increment by 1 start with 1;

然后在映射文件里指定使用序列的名字

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="sequence">
       <param name="sequence">seq_name</param>
    </generator>
</id>

5,hilo 
通过hi/lo算法生成主键,须要一个表来保存主键的信息,在数据库中建一张表:

create table hi_value(next_hi number not null);
insert into hi_value(next_hi) values(1);
commit;

映射文件里须要指明表的这些信息

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="hilo">
       <param name="table">hi_value</param>
       <param name="column">next_hi</param>
       <param name="max_lo">100</param>
    </generator>
</id>

6,seqhilo 
与hilo 相似,通过hi/lo 算法实现的主键生成机制,仅仅是主键历史状态保存在Sequence中。适用于支持Sequence的数据库, 
在数据库中建一个序列

create sequence seq_name increment by 1 start with 1;
<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="seqhilo">
        <param name="sequence">seq_name</param>
        <param name="max_lo">100</param>
    </generator>
</id>

7, native: 

由Hibernate依据不同的数据库方言自行推断采用identity、hilo、sequence当中一种作为Hibernate主键生成方式,native的长处是与底层无关。便于不同数据库之间的移植,由Hibernate依据不同数据库选择主键的生成方式。在oracle中需要创建叫 Hibernate_sequence名字的sequence。假设设置了Hibernate.hbm2ddl.auto属性,不须要手动建立序列,前提是数据库帐号必须有Create Sequence这样的高级权限。mysql等数据库则不用建立sequence。

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="native" />
</id>

 8,foreign 
外键生成方式,依赖其它表的主键。在主键一对一映射中须要使用到

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="foreign>
      <param name="property">id</param>
    </generator>
</id>

9,uuid.hex: 
採用基于128位的算法生成唯一值,并编制成32位长度的唯一字符串作为主键值,uuid.hex的长处是支持大部分数据库,缺点就是要占用较大的存储空间。

对于并发Insert要求较高的系统。推荐採用uuid.hex 作为主键生成机制。

<id name="id" column="ID">
    <!-- 主键生成机制 -->
    <generator class="uuid.hex" />
</id>

 10,uuid.string: 
使用UUID算法,UUID被编码为一个16个字符长的随意ASCII字符组成的字符串。

不能在PostgreSQL数据库中使用。

uuid.string同uuid.hex相似,须要占非常大的存储空间。 


11,select 
使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)


原文来源:

http://www.cnblogs.com/zhchoutai/p/8592563.html#3926052

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值