介绍
Hibernate是轻量级JavaEE应用的持久层解决方案,是一个面向Java环境的对象/关系数据库映射的工具,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。Hibernate不仅管理Java类到数据库表的映射(包括java数据类型到sql数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短使用JDBC处理数据持久化的时间。Hibernate完成对象模型和基于SQL的关系模型的映射关系。使得应用开发者可以完全采用面向对象的方式来开发应用程序。
ORM
ORM的全程是Object/Relation Mapping,对象/关系数据库映射。ORM可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。因此,我们可把ORM框架当成应用程序和数据库的桥梁。
Hibernate中的对象及操作
操作步骤
Hibernate并不推荐采用DriverManager来连接数据库,而是推荐使用数据源来管理数据库连接,这样能保证最好的性能。
为了使用Hibernate进行持久化操作,通常有如下操作步骤:
1、开发持久化类,由POJO加映射文件组成
2、获取Configuration
3、获取SessionFactory
4、获取Session,打开事务
5、关闭事务,关闭Session对POJO的操作必须在Session管理下才有是九华操作的能力才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory对象由Configuration对象生成,Configuration对象负责加Hibernate配置文件。
Hibernate中的对象
Configuration:
org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的映射配置,Configuration对象提供了一个buildSessionFactory方法,该方法可以产生一个不可变的SessionFactory对象。 随着Hibernate所使用配置文件的不同,创建Configuration对象的方式也不相同。通常有如下几种配置Hibernate的方式: 1、使用hibernate.properties文件作为配置文件 2、使用hibernate.cfg.xml文件作为配置文件 3、不使用任何配置文件,以编码方式创建Configuration对象。 Configuration实例的唯一作用是创建SessionFactory实例,所以它被设计成启动期间对象,一旦SessionFactory创建完成,它就被丢弃了。
SessionFactory:
这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它是线程安全的。它是生成Session的工厂,本身需要依赖于ConnectionProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
Session:
它是应用程序与持久化储存层之间的交互操作的一个单线程对象。它也是Hibernate持久化操作的关键对象,所有的持久化对象必须在Session管理下才可以进行持久化操作。此对象生存期很短。它底层封装了JDBC连接,它也是Transaction的工厂。Session对象持有一个必选的一级缓存,显式执行flush之前,所有持久化操作的数据都在缓存中Session对象处。
持久化对象:
系统创建的POJO实例,一旦与特定的Session关联,并对应数据表的指定记录,该对象就处于持久化状态,这一系列对象都被称为持久化对象。在程序中对持久化对象执行的修改,都将自动被转换为持久层的修改。持久化对象完全可以是普通的JavaBeans/POJO,唯一特殊的是它们正与一个Session关联。
瞬态对象和托管对象:
系统通过new关键字创建的Java实例,没有与Session相关联,此时处于瞬态。瞬态实例可能是在被应用程序实例化后,尚未进行持久化的对象。如果一个曾经持久化过的实例,但因为Session的关闭则转化为托管状态。
事务(Transaction):
代表一次原子操作,它具有数据库事务的概念。Hibernate事务是对底层具体的JDBC、JTA以及CORBA事务的抽象。在某些情况下,一个Session之内可能包含多个Transaction对象。虽然事务操作是可选的,单所有持久化操作都应该在事务管理下进行,即使是只读操作。
连接提供者(ConnectionProvider):
它是生成JDBC连接的工厂,它通过抽象将应用程序与底层的DataSource或DriverManager隔离开。这个对象无需应用程序直接访问,仅在应用程序需要扩展时使用。
事务工厂(TransactionFactory):
它是生成Transaction对象实例的工厂。
Hibernate配置文件属性设置
每个Hibernate配置文件对应一个Configuration对象。在极端的情况下,不使用任何配置文件也可创建Configuration对象。
数据源连接配置属性
hibernate.show_sql:是否把所有的SQL语句都输出到控制台(true\false)
hibernate.hbm2ddl.auto: 自动输出schema创建DDL语句 取值update\create\create-drop
hibernate.dialect:设置连接数据库所使用的方言(不同数据库之间迁移时,底层数据库的访问细节会发生改变,只要设置了合适的数据库方言,Hibernate将可以自动应付底层数据库访问所存在的细节差异)
hibernate.format_sql:是否将SQL语句转成格式良好的SQL。只接受true和false两个值。
hibernate.jdbc.fetch_size:指定JDBC抓取数量的大小,它可接受一个整数值。
hibernate.jdbc.batch_size:指定使用JDBC2的批量更新的大小,建议取5到30之间的值。
hibernate.connection.autocommit:设置是否自动提交,通常不建议打开自动提交。
hibernate.hbm2ddl.auto:设置当创建SessionFactory时,是否根据映射文件自动建立数据库表。如果使用create-drop值,显示关闭SessionFactory时,将Drop刚建的数据表。该属性可以为update、create和create-drop三个值。事务属性
hibernate.transaction.factory_class:指定Hibernate所用的事务工厂的类型,该属性值必须是TransactionFactory的直接或间接子类。外连接属性
hibernate.max_fetch_depth:设置外连接抓取树的最大深度
取值. 建议设置为0到3之间 ,设为0强在全局范围内禁止外连接抓取,设为1或更高值能启用N-1或1-1的外连接抓取。
Annotation映射集合属性
inverse:指定该集合关联的实体在双向关联关系中不控制关联关系。
cascade:指定对持久化对象的持久化操作(如save、update、delete)是否会级联到它所关联的子实体。
Maven配置
<!-- Hibernate4 -->
<dependency>
<groupId>com.googlecode.genericdao</groupId>
<artifactId>dao-hibernate</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>com.googlecode.genericdao</groupId>
<artifactId>search-jpa-hibernate</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.9.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.1.0.Final</version>
</dependency>
<!-- hibernate是否根据映射文件自动创建数据表 -->
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr-runtime</artifactId>
<version>3.3</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
<!-- Mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
Spirng相关的JAR包我就不说明了。