1. Hibernate 简介
Hibernate 是非常流行的对象 - 关系映射工具。
2. 什么是 ORM 映射
ORM ( Object Relational Mapping )简单的说,就是对象与关系的映射,对于实际应用来讲,对象一般指面向对象中的对象,关系指关系型数据库,对于我们具体的项目来说,就是将 java 中的对象与关系型数据库( oracle , mysql )中的表联系起来 。 Hibernate 是很强大的工具,当我们将建立联系的工作交给它后,就可以专注于与 java 中的对象打交道,而不需要知道它代表的是哪些表。
3. POJO (用来映射数据库中的表,构建我们的持久化层)
一个典型的 POJO
public class Person{
private long id;
private String name;
public void setId(BigDecimal value) {
this.id = value;
}
public BigDecimal getId() {
return this.id;
}
public void setName(String value) {
this.name = value;
}
public String getName() {
return this.name;
}
}
表面上看来,一个 POJO 与一个普通的 JavaBean 没有什么区别,我们需要了解的是如何让 POJO 和一个表建立联系。
4. 建立联系的桥梁,映射文件 XML 。
一个典型的映射文件 Person.hbm.xml ( 注意他的命名方式,一般是类名+ hbm + xml )
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping schema="SCOTT" package="mapping">
<class name="Person" table="PERSON" >
<id name="id" type="long" unsaved-value="null">
<column name="ID" not-null="true" index="SYS_C004143"/>
<generator class="native"/>
</id>
<property name="name" type="string" column="NAME"/>
</class>
</hibernate-mapping>
注意红线部分代表了 Pojo 对应的是那张表。
一般来说映射文件放在和 Pojo 同一个包
5. 和数据库的连接
Hibernate 配置文件,可以采用 xml 或者 property 文件。
一个典型的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">toposs</property>
<property name="hibernate.connection.password">toposs</property>
<property name="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="hibernate.connection.url">
jdbc:oracle:thin:@172.16.1.3:1521:orcl
</property>
<property name="hibernate.connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
</session-factory>
</hibernate-configuration>
6. Hibernate 在 Eclipse 中快速应用
6.1 新建一个工程,将 Hibernate3.jar 和你需要的数据库驱动添加到工程 path 中
6.2
在数据库中新建一个名为
person
的表。
6.3 在工程的默认 package 下建立一个 POJO , Person 类与表 person 对应。
public class Person{
private long id;
private String name;
public void setId(long value) {
this.id = value;
}
public long getId() {
return this.id;
}
public void setName(String value) {
this.name = value;
}
public String getName() {
return this.name;
}
}
6.4 现在我们来建立一个 xml 的映射文件( Person.hbm.xml )
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Person" table="PERSON">
<id name="id" type="long" unsaved-value="0">
<column name="ID" not-null="true"/>
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME"/>
</class>
</hibernate-mapping>
6.5 建立 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">tiger</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@172.16.1.2:1521:rsora</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hiberante.show_sql">true</property>
<mapping resource="Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
注意红线的部分将 mapping 文件写到 resource 中,如果有多个文件,要写多个文件,文件 的路径是对于根目录的绝对路径
6.6
项目结构图
6.7 所有准备工作都已经做好了 , 下面在 Person 中建立一个 main 方法,我们做一个简单的插入数据库的工作
6.7.1 Main 函数的代码
Public static main(String[] args){
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Person p=new Person();
p.setName("test");
session.save(p);
tran.commit();
session.close();
}
6.7.2 点击 Run As Java Application ,运行这个 main 函数
6.7.3 然后查看数据库
我们发现数据库已经新增加了一条记录
7. 最常见的关联关系,一对多关联。
7.1 用父子关系说明一对多(多对一关联)
在实际应用中,很少有一个表是独立的,大部分情况是表和表之间是有关联关系的,其中最常见的是一对多(多对一关联)。
父亲和儿子是典型的一对多关系,一个父亲有多个儿子,儿子只有一个父亲。在这个关系中,父亲是一方,儿子是多方。
7.2 在数据库中建立父子关系。
建表的 sql 语句:
CREATE TABLE father (
Father_id INTEGER NOT NULL,
name VARCHAR(10) NULL,
PRIMARY KEY (father_id) );
CREATE TABLE son (
Son_id INTEGER NOT NULL,
Son_name VARCHAR(10) NULL,
Father_ID INTEGER NULL
PRIMARY KEY (son_id),
FOREIGN KEY (father_id)
REFERENCES father
);
7.3 建立的表的结构
儿子的表
父亲的表
7.4 建立 POJO
同样在我们的工程的 defalt package 下面新建类 Father 和 Son 。
7.4.1 Father 类
public class Father {
private long fid;
private String name;
private Set sons = new HashSet();