Hibernate是一个开源,轻量级的ORM(对象关系映射)工具。Hibernate框架简化了java应用程序与数据库交互的开发。
ORM工具简化了数据创建,数据处理和数据访问。它是将对象映射到数据库中存储的数据(表)的编程技术。
注:为什么会有这篇教程文章?答:只是想写一篇最NB的Hibernate教程入门文章。NB代表人见人爱,花见花开,车见爆胎,飞鸟落地…,最后,需要注意的是:这篇文章包教不包会!除非你从头到尾认真看完并运行所有示例代码。
1. Hibernate快速入门简介
本教程文章基于以下工具(软件):
- Hibernate 5.2.2.Final
- Eclipse 4.6 (MARS)
Hibernate.x ~ Hibernate.5 更新功能:
-
从Hibernate 5.0开始Hibernate Spatial是Hibernate项目的一部分,因此我们也可以处理GIS数据了。
-
域模型映射支持Java 8日期和时间类型。 标准SQL日期/时间类型以及支持的Java 8
Date
/Time
类类型之间的映射,如下所示:- DATE:
java.time.LocalDate
- TIME:
java.time.LocalTime
,java.time.OffsetTime
- TIMESTAMP:
java.time.Instant
,java.time.LocalDateTime
,java.time.OffsetDateTime
和java.time.ZonedDateTime
- DATE:
-
字节码增强机制从头重新设计,Hibernate可支持Maven和Gradle插件。可以通过字节码仪器来增强三个主要方面:
- 懒初始化:字段可以声明为
LAZY
,只有在第一次被访问时,它们才被提取。 - 脏检查:实体被增强,使得它们可以跟踪在持久化上下文中加载之后变化的所有属性。
- 双向关联:即使开发人员仅更新单侧,但也可以自动同步双向关联的双方。
- 懒初始化:字段可以声明为
-
Hibernate的原生API(Session等)已更新为使用泛型类型化。无需在获取实体时转换。
Hibernate 5.0
将其扩展到更广泛的类型(例如UUID
)。- 引用二级缓存,使实体引用能够直接存储到第二级缓存中(用于不可变实体)。
2. 准备数据库
Hibernate是一个库,为了处理所有类型的数据库,它不依赖于应用程序选择的任何类型的数据库,如果Java是“一次写入到处运行”的语言,Hibernate则是“写一次就可运行在所有类型的数据库“中的框架。
在这篇文章中,使用的是MySQL数据(你可使用其它的数据库,如:Oracle,MySQL或SQL Server),并创建一个简单的数据库:mydb
,完整的数据库创建语句如下所示:
创建数据:
CREATE DATABASE IF NOT EXISTS mydb default charset utf8 COLLATE utf8_general_ci;
需要创建以下几张表,它们的关系图如下所示 -
创建表语句:
create table DEPARTMENT (
DEPT_ID integer not null,
DEPT_NAME varchar(255) not null,
DEPT_NO varchar(20) not null,
LOCATION varchar(255),
primary key (DEPT_ID),
unique (DEPT_NO)
);
create table EMPLOYEE (
EMP_ID bigint not null,
EMP_NAME varchar(50) not null,
EMP_NO varchar(20) not null,
HIRE_DATE date not null,
IMAGE longblob,
JOB varchar(30) not null,
SALARY float not null,
DEPT_ID integer not null,
MNG_ID bigint,
primary key (EMP_ID),
unique (EMP_NO)
);
create table SALARY_GRADE (
GRADE integer not null,
HIGH_SALARY float not null,
LOW_SALARY float not null,
primary key (GRADE)
);
create table TIMEKEEPER (
Timekeeper_Id varchar(36) not null,
Date_Time datetime not null,
In_Out char(1) not null,
EMP_ID bigint not null,
primary key (Timekeeper_Id)
);
alter table EMPLOYEE
add index FK75C8D6AE269A3C9 (DEPT_ID),
add constraint FK75C8D6AE269A3C9
foreign key (DEPT_ID)
references DEPARTMENT (DEPT_ID);
alter table EMPLOYEE
add index FK75C8D6AE6106A42 (EMP_ID),
add constraint FK75C8D6AE6106A42
foreign key (EMP_ID)
references EMPLOYEE (EMP_ID);
alter table EMPLOYEE
add index FK75C8D6AE13C12F64 (MNG_ID),
add constraint FK75C8D6AE13C12F64
foreign key (MNG_ID)
references EMPLOYEE (EMP_ID);
alter table TIMEKEEPER
add index FK744D9BFF6106A42 (EMP_ID),
add constraint FK744D9BFF6106A42
foreign key (EMP_ID)
references EMPLOYEE (EMP_ID);
向上面创建的表中,分别插入一些测试数据,如下所示 -
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (10, 'ACCOUNTING', 'D10', 'NEW YORK');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (20, 'RESEARCH', 'D20', 'DALLAS');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (30, 'SALES', 'D30', 'CHICAGO');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (40, 'OPERATIONS', 'D40', 'BOSTON');
-------------------------------------------------------------------------------------------------
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7839, 'KING', 'E7839', Str_To_Date('17-11-1981', '%d-%m-%Y'), 'PRESIDENT', 5000, 10, null);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7566, 'JONES', 'E7566', Str_To_Date('02-04-1981', '%d-%m-%Y'), 'MANAGER', 2975, 20, 7839);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7902, 'FORD', 'E7902', Str_To_Date('03-12-1981', '%d-%m-%Y'), 'ANALYST', 3000, 20, 7566);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7369, 'SMITH', 'E7369', Str_To_Date('17-12-1980', '%d-%m-%Y'), 'CLERK', 800, 20, 7902);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7698, 'BLAKE', 'E7698', Str_To_Date('01-05-1981', '%d-%m-%Y'), 'MANAGER', 2850, 30, 7839);
insert