OK,从这篇开始Himi将与大家一起进入Hibernate框架的学习啦,新手新手的说,希望大家多多指教;
对于Hibernate概述一下:
” Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 ”
本篇则简单介绍大家如何配置我们的第一个Hibernate框架环境和第一个项目,HelloHibernate;
——
准备工作:
1. Himi这里使用的一些开发资源如下:
1.1 hibernate-distribution-3.3.2.GA (hibernate核心包)
1.2 hibernate-annotations-3.4.0.GA (annotations核心包)
1.3 slf4j-1.5.8 (slf4j 实现库,虽然hibernate核心包中有slf4j的jar包,但是只是api包没有实现)
1.4 mysql-connector-java-3.1.14 (mysql 驱动)
OK了,关于资源下载,大家百度下,当然Himi这里用的不是最新的,刚上手怕最新的自己玩不转~咳咳、
Elipse 中user lib 配置工作:(这里Himi用的mac的eclipse)
我们添加到新建的一个 Java Project里,这里Himi新建的Java项目名:HelloHibernate;
打开你的Eclipse-偏好设置-User Libraries中:
点击 New… 新建,然后输入自定义名称,然后添加Hibernate所需的jar包,jar包一共8个如下:
|
/HibernateSoftWare/hibernate-distribution-3.3.2.GA/hibernate3.jar
/HibernateSoftWare/hibernate-distribution-3.3.2.GA/required/lib 下的6个jar包
/slf4j-1.5.8/slf4j-1.5.8/slf4j-nop-1.5.8.jar
|
如下图:

OK,搞定之后,然后右键你的项目,然后->Build Path->Add Libraries ->User Library->选择你新建的包含hibernate8个jar包的library即可;
继续右键你的项目Build Path->Add External Archives 将 mysql-connector-java-3.1.14, mysql驱动导入项目中;
MySQL 准备工作:
这里Himi新建一个数据库“hibernate”,新建表“teacher”;对于MySQL不太了解的,请移步到Himi本博客的MySQL相关博文中学习下吧,这里Himi不再赘述了;这里为了后续讲述便于理解,Himi将建立好的show出来让大家过目下;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellohibernate |
| hibernate |
| himiDB |
| mysql |
| people |
| performance_schema |
| test |
+--------------------+
8 rows in set (0.00 sec)
mysql> use hibernate;
Database changed
mysql> describe teacher;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gold | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.07 sec)
|
其中 id Himi将其设置为 primary key ;
准备工作完成后,我们首先创建两个类,一个入口函数类:
MainTest:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.himi.Teacher;
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
}
}
|
再创建一个Teacher类:( POJO)ps. 不太了解POJO的请百度下先~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.himi;
public class Teacher {
private int id;
private String name;
private int age;
private int gold;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGold() {
return gold;
}
public void setGold(int gold) {
this.gold = gold;
}
}
|
整个项目目录如下图所示:

大家先不要在意, hibernate.cfg.xml 和 Teacher.hbm.xml 这两个文件,下面再详细介绍;
首先我们使用Hibernate就应该先创建Hibernate的配置文件:(这里Himi采用默认此配置名为hibernate.cfg.xml,当然这个配置文件可以自定义名但是这个名字是否采用默认将影响后面我们使用的不同,这个后面将会详细讲解到)
下面是 hibernate.cfg.xml中的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?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>
<!-- Database connection settings 数据库的配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">Himi</property>
<!-- JDBC connection pool (use the built-in) hibernate自带连接池,暂不使用 -->
<!-- <property name="connection.pool_size">1</property> -->
<!-- SQL dialect 数据库方言,这里我们才爱用MySQL-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management 新功能,暂不使用 -->
<!-- <property name="current_session_context_class">thread</property> -->
<!-- Disable the second-level cache 二级缓存,放置不管 -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout 设置show_sql为true表示让hibernate将生成sql语句在控制台打印出来 -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup 是否让hibernate自动为我们创建表 -->
<!-- <property name="hbm2ddl.auto">update</property> -->
<mapping resource="com/himi/Teacher.hbm.xml"/> <!-- 这里是将需要mapping的文件进行再次声明 -->
</session-factory>
</hibernate-configuration>
|
这个配置文件我们不要自己写噢,去Hibernate的API文档中找到copy,然后简单针对项目进行设置即可;
OK,配置好这个文件其实就是对hibrenate进行的一些配置而已;
下面我们来看Teacher.hbm.xml文件:
这个文件的目录与Teacher.java默认放置同一级目录,约定俗成没有什么why;那么这个文件是个映射文件,它的主要作用是告诉hibernate我们Teacher类中的属性与数据库的哪些字段匹配;OK,看下其中的内容;
(注意这个文件,在Hibernate文档中也有例子,我们copy过来进行修改不要自己写!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.himi"><!-- 路径 -->
<class name="Teacher"> <!-- 映射的类名 -->
<id name ="id"/> <!-- 映射的数据库primary key -->
<!-- 下面都是映射我们的其他属性,如果你的数据库中的字段名相同则使用以下形式-->
<property name="name"/>
<property name="age"/>
<property name="gold"/>
<!--如果你的数据库中的字段名不相同则使用以下形式,例如:class 中 name, 数据库为 _name
那么书写形式如下:
<property name="name" column="_name" />
-->
</class>
</hibernate-mapping>
|
OK, 映射文件写完之后记得要在hibernate的配置文件(hibernate.cfg.xml)中进行声明:
|
<mapping resource="com/himi/Teacher.hbm.xml"/>
|
OK,下面我们来测试使用,打开我们的MainTest.java文件,添加内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.himi.Teacher;
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
Teacher teacher = new Teacher();//新建我们需要存储的类对象,并且设置其对象的一些属性
teacher.setId(1);
teacher.setName("Himi");
teacher.setAge(22);
teacher.setGold(123);
//Configuration主要用以读取配置文件
Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure().buildSessionFactory();
//这里注意了,cfg.configure()读取配置文件的时候,如果你的hibernate的文件名不采用默认的“hibernate.cfg.xml”的话,那么这里传入你定义的配置文件路径
//buildSessionFactory();得到一个创建Session的工场
Session ss = sf.openSession();//这里的Session导入import org.hibernate.Session;不要使用class经典的,因为可能会过时
ss.beginTransaction();//OK,将操作放入事务中
ss.save(teacher);//保存你的对象
ss.getTransaction().commit();//得到事务并提交
ss.close();//Session关闭
sf.close();//工厂关闭
}
}
|
OK,运行你的man函数类,运行结果:
|
Hibernate: insert into Teacher (name, age, gold, id) values (?, ?, ?, ?)
|
然后检验一下数据库中是否正常存入了一条数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellohibernate |
| hibernate |
| himiDB |
| mysql |
| people |
| performance_schema |
| test |
+--------------------+
8 rows in set (0.00 sec)
mysql> use hibernate;
Database changed
mysql> select *from teacher;
+----+------+------+------+
| id | name | age | gold |
+----+------+------+------+
| 1 | Himi | 22 | 123 |
+----+------+------+------+
1 row in set (0.00 sec)
|
噢,哈哈,看到一条 Himi 数据正常添加了哈哈~
那么这里再说两点:这里给出3个运行时出现的问题;
1. 出现 “Host” ‘xxx.xxx.x.xxx’ is not allowed to connect to this mysql server错误;
如下图:

解决方法:
允许用户从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码
|
GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY
'mypassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
|
2. 出现 ‘xxx.xxx.x.xxx’ (using password:YES) 错误;
如下图:

解决方法:
Mysql中执行:
|
grant all on *.* to root@192.168.1.15 identified by 'Himi'
|
注意这里by 后单引号内是电脑的user的名字;
3.可能有童鞋第一次运行正常,但是第二次运行则出现 Duplicate entry ‘1’ for key ‘PRIMARY’ 错误;
这个问题是主健重复了的错误~ 因为主键约束: 主键不能为空,也不能重复 !
如果对Mysql不了解的,可以先采用从mysql ,truncate 掉你table的数据,再运行就好了!或者将Teacher对象的ID不要与已存在数据库中的主建id重复即可;
源码下载: “HelloHibernate.zip” 下载地址: http://vdisk.weibo.com/s/hq1cA