Hibernate需要知道如何装载和存储持久类的对象。Hibernate的映射文件正是用来告诉hibernate可以访问数据库中的哪个表,以及这个表中的哪些列可以被使用。一个映射文件的基本结构如下:
<?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>
[...]
</hibernate-mapping>
注意到hibernate 的DTD文件是非常复杂的。用它们可以使你在xml的编辑工具或你的IDE中自动完成xml的映射元素和属性。也可以在编辑工具中打开这些DTD文件――这也是最简单的浏览所有元素和属性以及默认值,及一些注释的方法。注意,hibernate并不是从web站点去装载这些DTD文件,而是先从classpath中去寻找。这些DTD文件包含在hibernate3.jar文件中,位于hibernate发布文件的src目录下。
在以后的例子中为了使代码简短,我们将省略DTD文件声明部分。
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
</class>
</hibernate-mapping>
如上,class的name属性指定hibernate的持久化类,它的格式包括了完整的类名(即包名.类名)。Table属性指定了与Event类对应的数据库中的表名(即EVENTS表)。
到目前为止,我们已经告诉hibernate如何用Event类的对象来持有EVENTS表,每个Event类的实例代表了表中的一行记录。
接下来我们继续用一个唯一的表示属性来对应表中的主键。另外,我们不关心如何操作这个唯一的表示符,因此我们将hibernate的标识符生成策略配置为如下:
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
</class>
</hibernate-mapping>
Id元素是对标识属性的声明,name = “id”是对java类属性的声明。Hibernate将会调用getter和setter方法来访问这个属性。Column属性表明这个属性代表的是EVENTS表的主键列,即EVENTS_ID列。接下来的generator元素指定了标识符的生成策略,在这里我们用的是native策略,这个策略依据配置的数据库的类型自动选择最优的策略来生成主键。(比如:sql server会采用自动增长的方式,oracle会采用sequnence的方式来生成主键)。Hibernat还支持其他的几种主键生成方式。
最后,在映射文件中加入对类的持久化属性的声明。如下:
<hibernate-mapping
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
和id元素一样,这行属性元素的name值将告诉hibernate该调应哪些getter和setter函数。因此,在这里,hibernate将寻找getDate()和setDate(),getTitle()/setTitle();
注意到date属性元素中包含了colunm值,但是title却没有。如果没有指定与该属性对应的表中的列的名称,即没有指定column,默认使用和列名和属性名一样。
同样注意到title属性映射时还缺少type字段,在映射文件中使用的type字段,并不是指java中的数据类型,也不是数据库的类型。这些类型叫做hibernate映射类型,转换器可以将java的类型转换为数据库的类型,反之亦然。如果没有指定type字段的话,hibernate会自动决定采用正确的转换器和映射类型。在某些情况下这种自动转换决定可能达不到预期的效果。对于date属性就存在着这样的问题。Hibernate不知道应该将这个属性映射为SQL的date类型,timestamp还是time类型。为保证完整的信息,我们把它映射为timestamp转换器。
这个映射文件应该被保存为Event.hbm.xml,并和Event类放于同一个目录下。
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml