Welcome 微信登录

首页 / 软件开发 / JAVA / Hibernate及JPA 对象关系映射的简单映射策略

Hibernate及JPA 对象关系映射的简单映射策略2013-09-16 IBM 王 汉敏简单映射

近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场 热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 Toplink。Sun 公司在充分吸收现有的优秀 ORM 尤其是 Hibernate 框架设计思想的基础上,制定了新的 JPA(Java Persistence API)规范,对现在乱象丛生的持久 化市场带来一个标准,大有统一持久化市场的气势。JPA 是通过 JDK5.0 注解或 XML 描述对象 - 关系表的映射关系,并将 运行期实体对象持久化到数据库中去。JPA 规范小组的领导人就是 Hibernate 的发明者 Gavin King,JPA 规范的制定过程 中大量参考了 Hibernate 的内容,所以如果一个对 Hibernate 很熟悉的人,使用起来 JPA 会是轻车熟路,驾轻就熟的, 并且会感觉到更简单一些,这主要得益于 JDK5 中引入的注解(annotation)。

下面就使用注解介绍一下 JPA 的使 用。

首先用个小例子介绍一下如何将一个单个 Java 类映射到数据库中。

清单 1. Employee 实体

@Entitypublic class Employee implements Serializable {private static final long serialVersionUID = 1L;@Id private Long id;private String name;private int age;private String addree;// Getters and Setters }
如果没有 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解的话,它完全就是一个典型的 POJO 的 Java 类,现在加上这两个注解之后,就可以作为一个实体类与数据库中的表相对应。他在数据库中的对应的表为 :

图 1. Employee 表对应的 ER 图

映射规则:

1. 实体类必须用 @javax.persistence.Entity 进行注解;

2. 必须使用 @javax.persistence.Id 来注解一个主键;

3. 实体 类必须拥有一个 public 或者 protected 的无参构造函数,之外实体类还可以拥有其他的构造函数;

4. 实体类必 须是一个顶级类(top-level class)。一个枚举(enum)或者一个接口(interface)不能被注解为一个实体;

5. 实体类不能是 final 类型的,也不能有 final 类型的方法;

6. 如果实体类的一个实例需要用传值的方式调用(例 如,远程调用),则这个实体类必须实现(implements)java.io.Serializable 接口。

将一个 POJO 的 Java 类映 射成数据库中的表如此简单,这主要得益于 Java EE 5种引入的 Configuration by Exception 的理念,这个理念的核 心就是容器或者供应商提供一个缺省的规则,在这个规则下程序是可以正确运行的,如果开发人员有特殊的需求,需要改变 这个默认的规则,那么就是对默认规则来说就是一个异常(Exception)。

如上例所示:默认的映射规则就是数据库 表的名字和对应的 Java 类的名字相同,表中列的名字和 Java 类中相对应的字段的名字相同。

现在我们可以改变 这种默认的规则:

清单 2. 使用 @Table 和 @Column 注解修改映射规则

@Entity@Table(name="Workers") public class Employee implements Serializable {private static final long serialVersionUID = 1L;@Id @GeneratedValue private Long id;@Column(name="emp_name", length=30)private String name;@Column(name="emp_age", nullable=false)private int age;@Column(name="emp_address", nullable=false ,unique=true)private String addree;// Getters and Setters }