ITEEDU

Hibernate Gossip: 映射文件

Hibernate 中将对象与数据库表格映像关系连接起来的是映射文件,通常以*.hbm.xml作为文件名称,映射文件可以手工撰写,或是透过工具程序从数据库表格自动生成,或是透过工具程序从Java类别自动生成。

来看看一个基本的映射文件如何撰写:
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与主键映射-->
<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>
映射文件中主要包括三个部份:类别名称与表格名称的映像、id属性与主键的映像、类别属性与表格字段的映像。

这份映射文件对应于以下的类别与表格:
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;
}
}
user 表格
 +-------+------------------+------+------+----------+---------------------+
 | Field  | Type               | Null | Key  | Default | Extra                   |
+-------+------------------+-------+-----+----------+---------------------+
 | id       | int(11)            |            | PRI | NULL   | auto_increment |
 | name | varchar(100) |            |         |              |                              |
 | age    | int(11)            | YES   |         | NULL   |                              | 
+-------+------------------+------+------+----------+---------------------+


在<id>的设定上,name设定类别上的属性名,而column对应至表格字段,在type上可以设定Java类别的数据型态,但由于 Java的数据型态与数据库的数据型态并不是一对一对应的,为此Hibernate提供它自己的数据型态,作为Java数据型态与数据库数据型态的连接型 态,下面的表格列出型态之间的对应:
Java数据型态 Hibernate数据型态 标准SQL数据型态
byte、java.lang.Byte byte TINYINT
short、java.lang.Short short SMALLINT
int、java.lang.Integer integer INGEGER
long、java.lang.Long long BIGINT
float、java.lang.Float float FLOAT
double、java.lang.Double double DOUBLE
java.math.BigDecimal big_decimal NUMERIC
char、java.lang.Character character CHAR(1)
boolean、java.lang.Boolean boolean BIT
java.lang.String string VARCHAR
boolean、java.lang.Boolean yes_no CHAR(1)('Y'或'N')
boolean、java.lang.Boolean true_false CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date date DATE
java.util.Date、java.sql.Time time TIME
java.util.Date、java.sql.Timestamp timestamp TIMESTAMP
java.util.Calendar calendar TIMESTAMP
java.util.Calendar calendar_date DATE
byte[] binary VARBINARY、BLOB
java.lang.String text CLOB
java.io.Serializable serializable VARBINARY、BLOB
java.sql.Clob clob CLOB
java.sql.Blob blob BLOB
java.lang.Class class VARCHAR
java.util.Locale locale VARCHAR
java.util.TimeZone timezone VARCHAR
java.util.Currency currency VARCHAR

<generator>设定主键的生成方式,可以设定"native"表示由Hibernate自动根据Dialect选择采用 identity、hilo、sequence等作为主键生成方式,也可以考虑采用uuid由Hibernate根据128位UUID算法(128- bit UUID algorithm)生成16进位制数值,并编码为32位长度的字符串,还有其它的主键生成方式,可以参考官方手册的 Generator 说明。