ITEEDU

Hibernate Gossip: 第一个 Hibernate


这边以一个简单的单机程序来示范Hibernate的配置与功能,首先作数据库的准备工作,在MySQL中新增一个demo数据库,并建立user表格:

CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default '',
    age INT
    );

对于这个表格,您有一个User类别与之对应,表格中的每一个字段将对应至User实例上的Field成员。

User.java
package onlyfun.caterpillar;

public class User {
private Integer id;
private String name;
private Integer age;

// 必须要有一个预设的建构方法
// 以使得Hibernate可以使用Constructor.newInstance()建立对象
public User() {
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}

其中id是个特殊的属性,Hibernate会使用它来作为主键识别,您可以定义主键产生的方式,这是在XML映像文件中完成,为了告诉 Hibernate您所定义的User实例如何映像至数据库表格,您撰写一个XML映射文件档名是User.hbm.xml,如下所示:

User.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="onlyfun.caterpillar.User" table="user">

<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>

<property name="name" column="name" type="java.lang.String"/>

<property name="age" column="age" type="java.lang.Integer"/>

</class>

</hibernate-mapping>

<class>卷标的name属性为所映像的对象,而table为所映像的表格;<id>中column属性指定了表格字段,而 type属性指定了User实例的中的id之型态,这边type中所设定的是直接指定Java中的对象型态,Hibernate也定义有自己的映像型态, 作为Java对象与SQL型态的标准对应型态(因为语言所提供的类型并不一定与数据库的类型对应),这之后会再说明。

<id>中主键的产生方式在这边设定为"native",表示主键的生成方式由Hibernate根据数据库Dialect的定义来决定,之后还会介绍其它主键的生成方式。。

同样的,<property>标签中的column与type都各自指明了表格中字段与对象中属性的对应。

接着必须在Hibernate配置文件hibernate.cfg.xml中指明映像文件的位置,如下加入映像文件位置:

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>

....

<!-- 对象与数据库表格映像文件 -->
<mapping resource="onlyfun/caterpillar/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>



接下来撰写一个测试的程序,这个程序直接以Java程序设计人员熟悉的语法方式来操作对象,而实际上也直接完成对数据库的操作,程序将会将一笔数据存入表格之中:

FirstHibernate.java
package onlyfun.caterpillar;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class FirstHibernate {

public static void main(String[] args) {
// Configuration 负责管理 Hibernate 配置讯息
Configuration config = new Configuration().configure();
// 根据 config 建立 SessionFactory
// SessionFactory 将用于建立 Session
SessionFactory sessionFactory = config.buildSessionFactory();

// 将持久化的物件
User user = new User();
user.setName("caterpillar");
user.setAge(new Integer(30));

// 开启Session,相当于开启JDBC的Connection
Session session = sessionFactory.openSession();
// Transaction表示一组会话操作
Transaction tx= session.beginTransaction();
// 将对象映像至数据库表格中储存
session.save(user);
tx.commit();
session.close();
sessionFactory.close();

System.out.println("新增资料OK!请先用MySQL观看结果!");
}
}
如您所看到的,程序中只需要直接操作User对象,并进行Session与Transaction的相关操作,Hibernate就会自动完成对数据库的操作,您看不到任何一行JDBC或SQL的陈述,撰写好以上的各个档案之后,各档案的放置位置如下:

第一个Hibernate

接着可以开始运行程序,结果如下:
Hibernate: insert into user (name, age) values (?, ?)
新增资料OK!请先用MySQL观看结果!


执行结果中显示了Hibernate所实际使用的SQL,由于这个程序还没有查询功能,所以要进入MySQL中看看新增的数据,如下:
mysql> select * from user;
+----+-------------+------+
| id    | name         | age  |
+----+-------------+------+
|  1    | caterpillar |   30   |
+----+-------------+------+
1 row in set (0.03 sec)