映射文件

一个对象/关系型映射一般定义在 XML 文件中。映射文件指示 Hibernate 如何将已经定义的类或类组与数据库中的表对应起来。

尽管有些 Hibernate 用户选择手写 XML 文件,但是有很多工具可以用来给先进的 Hibernate 用户生成映射文件。这样的工具包括 XDoclet, MiddlegenAndroMDA

让我们来考虑我们之前定义的 POJO 类,它的对象将延续到下一部分定义的表中。

  1. public class Employee {
  2. private int id;
  3. private String firstName;
  4. private String lastName;
  5. private int salary;
  6. public Employee() {}
  7. public Employee(String fname, String lname, int salary) {
  8. this.firstName = fname;
  9. this.lastName = lname;
  10. this.salary = salary;
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId( int id ) {
  16. this.id = id;
  17. }
  18. public String getFirstName() {
  19. return firstName;
  20. }
  21. public void setFirstName( String first_name ) {
  22. this.firstName = first_name;
  23. }
  24. public String getLastName() {
  25. return lastName;
  26. }
  27. public void setLastName( String last_name ) {
  28. this.lastName = last_name;
  29. }
  30. public int getSalary() {
  31. return salary;
  32. }
  33. public void setSalary( int salary ) {
  34. this.salary = salary;
  35. }
  36. }

对于每一个你想要提供持久性的对象都需要一个表与之保持一致。考虑上述对象需要存储和检索到下列 RDBMS 表中:

  1. create table EMPLOYEE (
  2. id INT NOT NULL auto_increment,
  3. first_name VARCHAR(20) default NULL,
  4. last_name VARCHAR(20) default NULL,
  5. salary INT default NULL,
  6. PRIMARY KEY (id)
  7. );

基于这两个实体之上,我们可以定义下列映射文件来指示 Hibernate 如何将已定义的类或类组与数据库表匹配。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="Employee" table="EMPLOYEE">
  7. <meta attribute="class-description">
  8. This class contains the employee detail.
  9. </meta>
  10. <id name="id" type="int" column="id">
  11. <generator class="native"/>
  12. </id>
  13. <property name="firstName" column="first_name" type="string"/>
  14. <property name="lastName" column="last_name" type="string"/>
  15. <property name="salary" column="salary" type="int"/>
  16. </class>
  17. </hibernate-mapping>

你需要以格式 .hbm.xml 保存映射文件。我们保存映射文件在 Employee.hbm.xml 中。让我们来详细地看一下在映射文件中使用的一些标签:

  • 映射文件是一个以 为根元素的 XML 文件,里面包含所有 标签。
  • 标签是用来定义从一个 Java 类到数据库表的特定映射。Java 的类名使用 name 属性来表示,数据库表明用 table 属性来表示。
  • 标签是一个可选元素,可以被用来修饰类。
  • 标签将类中独一无二的 ID 属性与数据库表中的主键关联起来。id 元素中的 name 属性引用类的性质,column 属性引用数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。
  • 在 id 元素中的 标签用来自动生成主键值。设置 generator 标签中的 class 属性可以设置 native 使 Hibernate 可以使用 identity, sequencehilo 算法根据底层数据库的情况来创建主键。
  • 标签用来将 Java 类的属性与数据库表的列匹配。标签中 name 属性引用的是类的性质,column 属性引用的是数据库表的列。type 属性保存 Hibernate 映射的类型,这个类型会将从 Java 转换成 SQL 数据类型。

还有一些其它属性和元素可用在映射文件中,我会在其它讨论 Hibernate 相关的主题中尽可能得涉及更多。