`
yuanfen860913
  • 浏览: 119927 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

开源技术:Hibernate 3注释简介

阅读更多

在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准。它非常强大、灵活,而且具备了优异的性能。在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松。
  传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。创建这些映射有很多方法,可以从已有数据库模式或Java类模型中自动创建,也可以手工创建。无论如何,您最终将获得大量的 Hibernate 映射文件。此外,还可以使用工具,通过javadoc样式的注释生成映射文件,尽管这样会给您的构建过程增加一个步骤。

  在最近发布的几个Hibernate版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法。借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来定义——注释直接嵌入到您的 Java 类中,并提供一种强大及灵活的方法来声明持久性映射。籍由自动代码完成和语法突出显示功能,最近发布的Java IDE也为其提供了有力的支持。

  Hibernate Annotation还支持新的 EJB 3 持久性规范。这些规范旨在提供一种标准化的 Java 持久性机制。由于 Hibernate 3 还提供了一些扩展,因此您可以十分轻松地遵从这些标准,并使用 EJB 3 编程模型来对 Hibernate 持久层进行编码。

  现在,让我们来动手使用Hibernate Annotation。

安装 Hibernate Annotation
  要使用 Hibernate Annotation,您至少需要具备 Hibernate 3.2和Java 5。可以从 Hibernate 站点 下载 Hibernate 3.2 和 Hibernate Annotation库。除了标准的 Hibernate JAR 和依赖项之外,您还需要 Hibernate Annotations .jar 文件(hibernate-annotations.jar)、Java 持久性 API (lib/ejb3-persistence.jar)。如果您正在使用 Maven,只需要向 POM 文件添加相应的依赖项即可,如下所示:

...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.1.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.2.0.ga</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
...
  下一步就是获取 Hibernate 会话工厂。尽管无需惊天的修改,但这一工作与使用 Hibernate Annotations有所不同。您需要使用 AnnotationConfiguration 类来建立会话工厂:

sessionFactory = newAnnotationConfiguration().buildSessionFactory();
  尽管通常使用 <mapping> 元素来声明持久性类,您还是需要在 Hibernate 配置文件(通常是 hibernate.cfg.xml)中声明持久性类:

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.onjava.modelplanes.domain.PlaneType"/>
<mapping class="com.onjava.modelplanes.domain.ModelPlane"/>
</session-factory>
</hibernate-configuration>
  近期的许多 Java 项目都使用了轻量级的应用框架,例如 Spring。如果您正在使用 Spring 框架,可以使用 AnnotationSessionFactoryBean 类轻松建立一个基于注释的 Hibernate 会话工厂,如下所示:

<!-- Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
...
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.onjava.modelplanes.domain.PlaneType</value>
<value>com.onjava.modelplanes.domain.ModelPlane</value>
...
</list>
</property>
</bean>
第一个持久性类
  既然已经知道了如何获得注释所支持的 Hibernate 会话,下面让我们来了解一下带注释的持久性类的情况:

  像在其他任何 Hibernate应用程序中一样,带注释的持久性类也是普通 POJO。差不多可以说是。您需要向 Java 持久性 API (javax.persistence.*)添加依赖项,如果您正在使用任何特定于 Hibernate的扩展,那很可能就是 Hibernate Annotation 程序包(org.hibernate.annotations.*),但除此之外,它们只是具备了持久性注释的普通 POJO 。下面是一个简单的例子:

@Entity
public class ModelPlane {
private Long id;
private String name;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
  正像我们所提到的,这非常简单。@Entity 注释声明该类为持久类。@Id 注释可以表明哪种属性是该类中的独特标识符。事实上,您既可以保持字段(注释成员变量),也可以保持属性(注释getter方法)的持久性。后文中将使用基于属性的注释。基于注释的持久性的优点之一在于大量使用了默认值(最大的优点就是 “惯例优先原则(convention over configuration)”)。例如,您无需说明每个属性的持久性——任何属性都被假定为持久的,除非您使用 @Transient 注释来说明其他情况。这简化了代码,相对使用老的 XML 映射文件而言也大幅地减少了输入工作量。

生成主键
  Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。下面的示例说明了一种常用的方法,其中 Hibernate 将会根据底层数据库来确定一种恰当的键生成策略:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
定制表和字段映射
  默认情况下,Hibernate 会将持久类以匹配的名称映射到表和字段中。例如,前一个类可以与映射到以如下代码创建的表中:

CREATE TABLE MODELPLANE
(
ID long,
NAME varchar
)
  如果您是自己生成并维护数据库,那么这种方法很有效,通过省略代码可以大大简化代码维护。然而,这并不能满足所有人的需求。有些应用程序需要访问外部数据库,而另一些可能需要遵从公司的数据库命名惯例。如果有必要,您可以使用 @Table 和 @Column 注释来定制您自己的持久性映射,如下所示:

@Entity
@Table(name="T_MODEL_PLANE")
public class ModelPlane {
private Long id;
private String name;
@Id
@Column(name="PLANE_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="PLANE_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
  该内容将映射到下表中:

CREATE TABLE T_MODEL_PLANE
(
PLANE_ID long,
PLANE_NAME varchar
)
  也可以使用其他图和列的属性来定制映射。这使您可以指定诸如列长度、非空约束等详细内容。Hibernate支持大量针对这些注释的属性。下例中就包含了几种属性:

...
@Column(name="PLANE_ID", length=80, nullable=true)
public String getName() {
return name;
}
...
映射关系
  Java 持久性映射过程中最重要和最复杂的一环就是确定如何映射表间的关系。像其他产品一样, Hibernate 在该领域中提供了高度的灵活性,但却是以复杂度的增加为代价。我们将通过研究几个常见案例来了解如何使用注释来处理这一问题。

  其中一种最常用的关系就是多对一的关系。假定在以上示例中每个 ModelPlane 通过多对一的关系(也就是说,每个飞机模型只与一种飞机类型建立联系,尽管指定的飞机类型可以与七种飞机模型建立联系)来与 PlaneType 建立联系。可如下进行映射:

@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
public PlaneType getPlaneType() {
return planeType;
}
  CascadeType 值表明 Hibernate 应如何处理级联操作。

  另一种常用的关系与上述关系相反:一对多再对一关系,也称为集合。在老式的 Hibernate 版本中进行映射或使用注释时,集合令人头疼,这里我们将简要加以探讨,以使您了解如何处理集合,例如,在以上示例中每个 PlaneType 对象都可能会包含一个 ModelPlanes 集合。可映射如下:

@OneToMany(mappedBy="planeType",
cascade=CascadeType.ALL,
fetch=FetchType.EAGER)
@OrderBy("name")
public List<ModelPlane> getModelPlanes() {
return modelPlanes;
}
命名查询
  Hibernate 最优秀的功能之一就在于它能够在您的映射文件中声明命名查询。随后即可通过代码中的名称调用此类查询,这使您可以专注于查询,而避免了 SQL 或者 HQL 代码分散于整个应用程序中的情况。

  也可以使用注释来实现命名查询,可以使用 @NamedQueries 和 @NamedQuery 注释,如下所示:

@NamedQueries(
{
@NamedQuery(
name="planeType.findById",
query="select p from PlaneType p left join fetch p.modelPlanes where id=:id"
),
@NamedQuery(
name="planeType.findAll",
query="select p from PlaneType p"
),
@NamedQuery(
name="planeType.delete",
query="delete from PlaneType where id=:id"
)
}
)
  一旦完成了定义,您就可以像调用其他任何其他命名查询一样来调用它们。

结束语
  Hibernate 3 注释提供了强大而精致的 API,简化了 Java 数据库中的持久性代码,本文中只进行了简单的讨论。您可以选择遵从标准并使用 Java 持久性 API,也可以利用特定于 Hibernate的扩展,这些功能以损失可移植性为代价提供了更为强大的功能和更高的灵活性。无论如何,通过消除对 XML 映射文件的需求,Hibernate 注释将简化应用程序的维护,同时也可以使您对EJB 3 有初步认识。来试试吧!

资源
Hibernate 站点
Spring 站点

作者简介
John Ferguson Smart 从1991年起涉足IT行业,从1999年起开始参与J2EE开发。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alex197963/archive/2007/05/04/1595929.aspx

分享到:
评论

相关推荐

    Hibernate 源代码及重要说明

    Hibernate 是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在Java应用中管理和持久化数据到关系数据库的方法。通过Hibernate,开发人员可以将数据库操作转化为对Java对象的操作,极大地提高了开发...

    《Hibernate 3 API参考手册》-电子文档下载(PDF)

    在描述中提到的“配合Hibernate 3中文参考使用”,意味着此手册可能包含有中文翻译或注释,这对于中文使用者来说是极大的便利,能够帮助他们更好地理解和应用Hibernate 3的API。 关于Hibernate 3 API,它是...

    Hibernate_Codebase:带有注释的Hibernate 5

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发人员将数据库操作抽象化,使得在处理数据库时可以使用面向对象的方式。在"Hibernate_Codebase:带有注释的Hibernate 5"中,我们可以深入理解这个强大...

    hibernate-core-4.3.5.final-javadocs-chm

    1. **Hibernate 概述**:Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者用 Java 对象来操作数据库,消除了 JDBC 的繁琐工作,提高了开发效率。 2. **Entity(实体)**:在 Hibernate 中,实体代表...

    hibernate4.1.4.FinalAPI,开发手册,开发指南

    1. **Hibernate ORM框架**:Hibernate是一个开源的ORM库,它允许开发者用面向对象的方式处理数据库操作,减少了SQL的直接使用,提高了代码的可读性和可维护性。在Hibernate中,实体类代表数据库中的表,实体对象代表...

    annotation(注释)版本的hibernate

    Hibernate是一个开源的对象关系映射框架,它允许开发者用面向对象的方式处理数据库操作,极大地提高了开发效率。传统的Hibernate配置主要依赖于XML文件,但随着JPA(Java Persistence API)的推广,注解成为主流,...

    jeefast快速开发平台开源项目:较为完整的管理系统

    友好的代码结构及注释,便于阅读及二次开发 实现前后端分离,通过token进行数据交互,前端再也不用关注后端技术 灵活的权限控制,可控制到页面或按钮,满足绝大部分的权限需求 完善的代码生成机制,可生成entity、...

    hibernate简单总结

    Hibernate 是一个流行的开源对象关系映射(ORM)框架,主要用于简化Java应用程序与数据库之间的交互。它允许开发者使用面向对象的编程模型,而无需直接编写SQL语句,从而降低了数据库操作的复杂性。以下是Hibernate...

    hibernate如何用O/R Mapping框架来实现我们的数据层

    - **开源协议**:Hibernate遵循LGPL(Lesser General Public License)开源协议。 - **流行度**:据不完全统计,每月有大约13,000次下载量,这充分证明了其在业界的广泛认可和使用。 - **API设计**:Hibernate提供了...

    SSH项目(spring+hibernate+struts2)

    SSH项目是一种经典的Java Web开发框架组合,由Spring、Hibernate和Struts2三个开源框架组成。这个项目示例提供了一个基于这些技术的简单应用,帮助开发者理解如何将它们整合在一起进行实际开发。 **Spring框架**是...

    hibernate+struts2 项目源码

    1. **Hibernate**:Hibernate是一个开源的ORM(对象关系映射)框架,它简化了Java应用与数据库之间的交互。Hibernate允许开发者使用面向对象的方式来操作数据库,消除了SQL的直接编写,提高了开发效率。在项目中,你...

    myeclipse+hibernate项目配置包

    2. **Hibernate**: Hibernate是一个开源的Java ORM框架,它的主要作用是简化数据库操作,通过将Java对象映射到数据库表,使得开发者可以使用面向对象的方式进行数据库操作,避免了大量SQL语句的编写。Hibernate支持...

    hibernate3.2详细案例

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者在Java应用中处理数据库操作时使用面向对象的方式,极大地简化了数据库编程。Hibernate3.2是其发展中的一个重要版本,发布于2006年,引入了许多新特性,...

    基于SpringMVC+Hibernate开发的管理系统

    Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。Hibernate允许开发者使用面向对象的方式操作数据库,而无需编写大量的SQL语句。 1. **实体(Entity)**: 代表数据库表的...

    Hibernate Quickly

    Hibernate是一种开源的对象关系映射(ORM)框架,用于Java应用程序与数据库之间的交互。它为开发人员提供了一种将Java对象映射到数据库表,并将SQL查询语句转换为面向对象API的方法。这使得开发者能够用更自然、更...

    hibernate详解

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与业务逻辑解耦,通过对象模型来处理数据库数据。本篇将详细解释Hibernate2版本的相关概念、配置和使用方法。 首先,Hibernate2是...

    hibernate3和其原码

    Hibernate3是中国著名的开源对象关系映射(ORM)框架,它为Java开发者提供了强大的数据库访问工具。这个框架的主要目标是简化数据库操作,使开发者能够用面向对象的方式处理数据,而不是直接编写SQL语句。通过将Java...

Global site tag (gtag.js) - Google Analytics