映射文件的命名规则——类名.hbm.xml
映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
一个映射文件的基本结构:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="Event" table="EVENTS">
</class>- </hibernate-mapping>
注意:可以在文本编辑器里打开 DTD — 这是最简单的方式来概览所有的元素和 attribute,并查看它们的缺省值以及注释。
Hibernate 不会从 web 加载 DTD 文件,但它会首先在应用程序的 classpath 中查找。DTD 文件已包括在hibernate3.jar
里
在 hibernate-mapping
标签(tag)之间, 含有一个 class
元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到 SQL 数据库里的表。
每个实例对应着数据库表中的一行。
唯一标识符属性到数据库表的映射,由于我们不关心怎样处理这个标识符,我们就配置由 Hibernate 的标识符生成策略来产生代理主键字段
该属性也是在hibernate-mapping 标签(tag)之间,代码如下
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="Event" table="EVENTS">
- <id name="id" column="EVENT_ID">
- <generator class="native"/>
- </id>
- </class>
- </hibernate-mapping>
注释:id元素是对 identity 属性的声明。 name="id" 映射属性声明了 JavaBean 属性的名称并告诉 Hibernate 使用 getId() 和 setId()方法来访问这个属性。column 属性告诉 Hibernate events表中的哪个字段持有主键值。
generator 元素指定标识符的生成策略(也就是标识符值是怎么产生的)。在这个例子里,我们选择native
,它提供了取决于数据库方言的可移植性。Hibernate 数据库生成的、全局性唯一的以及应用程序分配的标识符。标识符值的生成也是 Hibernate 的扩展功能之一,你可以插入自己的策略。
最后我们在映射文件里面包含需要持久化属性的声明。默认情况下,类里面的属性都被视为非持久化的:
事例代码如下:
- <hibernate-mapping package="org.hibernate.tutorial.domain">
- <class name="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 元素一样,property元素的name属性告诉 Hibernate 使用哪个 getter 和 setter方法。
注意:为什么 date
属性的映射含有 column
attribute,而 title
却没有?当没有设定 column
attribute的时候,Hibernate 缺省地使用 JavaBean 的属性名作为字段名。对于title
,这样工作得很好。然而,date
在多数的数据库里,是一个保留关键字,所以我们最好把它映射成一个不同的名字。
如果在映射文件中没有设置 type
属性的话,Hibernate 会自己试着去确定正确的转换类型和它的映射类型。在某些情况下这个自动检测机制(在 Java 类上使用反射机制)不会产生你所期待或需要的缺省值。date
属性就是个很好的例子,Hibernate 无法知道这个属性(java.util.Date
类型的)应该被映射成:SQLdate
,或timestamp
,还是time
字段。在此例中,把这个属性映射成timestamp
转换器,这样我们预留了日期和时间的全部信息。
把新的映射加入到Hibernate的配置中:
格式:<mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>