转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/hibernate/783.html
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个如下:
1
2
3
4
5
|
/
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
&
gt
;
show
databases
;
+
--
--
--
--
--
--
--
--
--
--
+
|
Database
|
+
--
--
--
--
--
--
--
--
--
--
+
|
information_schema
|
|
hellohibernate
|
|
hibernate
|
|
himiDB
|
|
mysql
|
|
people
|
|
performance_schema
|
|
test
|
+
--
--
--
--
--
--
--
--
--
--
+
8
rows
in
set
(
0.00
sec
)
mysql
&
gt
;
use
hibernate
;
Database
changed
mysql
&
gt
;
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
|
&
lt
;
?
xml
version
=
'1.0'
encoding
=
'utf-8'
?
&
gt
;
&
lt
;
!
DOCTYPE
hibernate
-
configuration
PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
&
gt
;
&
lt
;
hibernate
-
configuration
&
gt
;
&
lt
;
session
-
factory
&
gt
;
&
lt
;
!
--
Database
connection
settings
数据库的配置
--
&
gt
;
&
lt
;
property
name
=
"connection.driver_class"
&
gt
;
com
.
mysql
.
jdbc
.
Driver
&
lt
;
/
property
&
gt
;
&
lt
;
property
name
=
"connection.url"
&
gt
;
jdbc
:
mysql
:
//localhost/hibernate</property>
&
lt
;
property
name
=
"connection.username"
&
gt
;
root
&
lt
;
/
property
&
gt
;
&
lt
;
property
name
=
"connection.password"
&
gt
;
Himi
&
lt
;
/
property
&
gt
;
&
lt
;
!
--
JDBC
connection
pool
(
use
the
built
-
in
)
hibernate自带连接池,暂不使用
--
&
gt
;
&
lt
;
!
--
&
lt
;
property
name
=
"connection.pool_size"
&
gt
;
1
&
lt
;
/
property
&
gt
;
--
&
gt
;
&
lt
;
!
--
SQL
dialect
数据库方言,这里我们才爱用
MySQL
--
&
gt
;
&
lt
;
property
name
=
"dialect"
&
gt
;
org
.
hibernate
.
dialect
.
MySQLDialect
&
lt
;
/
property
&
gt
;
&
lt
;
!
--
Enable
Hibernate'
s
automatic
session
context
management
新功能,暂不使用
--
&
gt
;
&
lt
;
!
--
&
lt
;
property
name
=
"current_session_context_class"
&
gt
;
thread
&
lt
;
/
property
&
gt
;
--
&
gt
;
&
lt
;
!
--
Disable
the
second
-
level
cache
二级缓存,放置不管
--
&
gt
;
&
lt
;
property
name
=
"cache.provider_class"
&
gt
;
org
.
hibernate
.
cache
.
NoCacheProvider
&
lt
;
/
property
&
gt
;
&
lt
;
!
--
Echo
all
executed
SQL
to
stdout
设置
show
_sql为
true表示让
hibernate将生成
sql语句在控制台打印出来
--
&
gt
;
&
lt
;
property
name
=
"show_sql"
&
gt
;
true
&
lt
;
/
property
&
gt
;
&
lt
;
!
--
Drop
and
re
-
create
the
database
schema
on
startup
是否让
hibernate自动为我们创建表
--
&
gt
;
&
lt
;
!
--
&
lt
;
property
name
=
"hbm2ddl.auto"
&
gt
;
update
&
lt
;
/
property
&
gt
;
--
&
gt
;
&
lt
;
mapping
resource
=
"com/himi/Teacher.hbm.xml"
/
&
gt
;
&
lt
;
!
--
这里是将需要
mapping的文件进行再次声明
--
&
gt
;
&
lt
;
/
session
-
factory
&
gt
;
&
lt
;
/
hibernate
-
configuration
&
gt
;
|
这个配置文件我们不要自己写噢,去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
|
&
lt
;
?
xml
version
=
"1.0"
?
&
gt
;
&
lt
;
!
DOCTYPE
hibernate
-
mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
&
gt
;
&
lt
;
hibernate
-
mapping
package
=
"com.himi"
&
gt
;
&
lt
;
!
--
路径
--
&
gt
;
&
lt
;
class
name
=
"Teacher"
&
gt
;
&
lt
;
!
--
映射的类名
--
&
gt
;
&
lt
;
id
name
=
"id"
/
&
gt
;
&
lt
;
!
--
映射的数据库
primary
key
--
&
gt
;
&
lt
;
!
--
下面都是映射我们的其他属性,如果你的数据库中的字段名相同则使用以下形式
--
&
gt
;
&
lt
;
property
name
=
"name"
/
&
gt
;
&
lt
;
property
name
=
"age"
/
&
gt
;
&
lt
;
property
name
=
"gold"
/
&
gt
;
&
lt
;
!
--如果你的数据库中的字段名不相同则使用以下形式,例如:
class
中
name,
数据库为
_name
那么书写形式如下:
&
lt
;
property
name
=
"name"
column
=
"_name"
/
&
gt
;
--
&
gt
;
&
lt
;
/
class
&
gt
;
&
lt
;
/
hibernate
-
mapping
&
gt
;
|
OK, 映射文件写完之后记得要在hibernate的配置文件(hibernate.cfg.xml)中进行声明:
1
|
&
lt
;
mapping
resource
=
"com/himi/Teacher.hbm.xml"
/
&
gt
;
|
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函数类,运行结果:
1
|
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
&
gt
;
show
databases
;
+
--
--
--
--
--
--
--
--
--
--
+
|
Database
|
+
--
--
--
--
--
--
--
--
--
--
+
|
information_schema
|
|
hellohibernate
|
|
hibernate
|
|
himiDB
|
|
mysql
|
|
people
|
|
performance_schema
|
|
test
|
+
--
--
--
--
--
--
--
--
--
--
+
8
rows
in
set
(
0.00
sec
)
mysql
&
gt
;
use
hibernate
;
Database
changed
mysql
&
gt
;
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作为密码
1
2
3
4
5
|
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中执行:
1
|
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