`
chenying998179
  • 浏览: 25693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate 3 Annotations 进阶

    博客分类:
  • java
 
阅读更多

安装 Hibernate Annotations

为了使用Hibernate Annotations,你需要最新的Hibernate 3.2 ,当然还有Java 5 你可以在Hibernate web site 这个网站下载Hibernate 3.2和Hibernate Annotations库.除了标准的Hibernate 库文件和必须的依赖库之外,还需要下载 Hibernate Annotations库和Java 持久化API ---ejb3-persstence.jar文件.如果你正在使用Maven,仅仅添加相应的依赖到你的DOM文件里,如下所示:

 ...
    <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 Session 工厂.利用Hibernate Annotations与不使用它创建Hibernate session工厂有一点不同,虽然不需要大幅度修改.你只需须简单地使用AnnotationConfiguration类安装你的session工厂:
    
sessionFactory
=new AnnotationConfiguration().buildSessionFactory();


一般的,你需要通过<mapping>元素在Hibernate配置文件里(hibernate.cfg.xml)声明持久化类
  
        <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框架,你可以容易地利用AnnotationSessionFactory类装配一个基于Annotations 的Hibernate Session Factory,如下:
<!-- 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>


我们第一个持久化类

现在我们知道如何获得基于Annotation的Hibernate Session ,让我们看看这个注解的持久化类看起来像什么样子.
被注解的持久化类是一般的POJO类,就像在其他Hibernate程序里的一样.好的,差不多了.你需要依赖于Java 持久化API (javax.persistence.*),并且还需要导入注解包类(org.hibernate.annotations.*)如果你使用了任何Hibernate扩展的话.但是除此之外,他们仅仅是拥有持久化相关注解的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方法.在这篇文章的剩余部分,我们将用基于属性的注解.关于基于注解的持久化一个好处是他的缺省行为.例如.你不需要声明每一个属性是否要被持久化-任何属性都假定将被持久化除非用@Transient注解了他. 对代码来说这是简单的,并且相对于旧的XML配置文件来说,也节省了很多打字量.

生成主键

Hibernate一个擅长的功能是主键自动生成,Hibernate/EJB 3注解也为主键自动生成提供了丰富的支持,允许诸多生成策略.下面例子演示了最常见的用途,这里Hibernate 根据数据库给出一个合适的主键生成策略.
    @Id
    @GeneratedValue (strategy=GenerationType.AUTO)
    public Long getId() {
        return id;
}


自定义表和字段映射
默认情况下,Hibernate将映射持久化类到表,用匹配的字段名映射.例如,上面的类将经由下列SQL语句映射到表:
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
)


你可以利用Table和Column属性自定义映射.它可让你指定诸如列长度,not-null约束等等,hibernate支持大量的属性注解:
...
    @Column(name="PLANE_ID", length=80, nullable=true)
    public String getName() {
        return name;
}
… 


映射关系

Java持久化映射中一个最重要,最复杂的部分是确定怎么映射表间的关系.如其他的特性一样,Hibernate在这方面也提供了大量的灵活性,但是以增加了某种复杂度为代价的.我们将浏览一系列共同的用例以对如何使用注解有个大体认识.
最常用的一个关系是many-to-one关系.假定在上面的例子中,每个ModelPlane经由many-to-one关系被关联到一个PlaneType (换句话说每个Model plane 被确切的关联到一个 plane type,通过给定一个plane type可以被关联到多个 model plane ),你可以映射如下:
   @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    public PlaneType getPlaneType() {
                    return planeType;
          }


这个CascadeType值表示Hibernate将怎么进行级联操作
另外一个常用的关系是与上面相对的:one-to-many关系,也以集合而闻名,集合将映射变得有些复杂,在旧的和新的注解中,并且我们将撇开表面细节直接给你完成的例子以给你一个大概,例如在上面例子中,每一个PlaneType对象可能包含一个ModelPlane的集合,可以映射如下:

    @OneToMany(mappedBy="planeType",
                   cascade=CascadeType.ALL, 
                   fetch=FetchType.EAGER)
    @OrderBy("name")
    public List<ModelPlane> getModelPlanes() {
        return modelPlanes;
}


命名查询
Hibernate一个优秀的特征是可以在映射文件申明命名查询的能力.这些查询可以通过名字在代码里调用,这可以让你集中查询且避免有sql或者Hql代码分散在程序里.

你也可以通过注解,利用@NameQueries和@NameQuery注解,如下:

@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大门的幽径.

分享到:
评论

相关推荐

    hibernate3资源包

    总的来说,这个“hibernate3资源包”为Java开发者提供了一整套的Hibernate 3开发工具,涵盖了ORM的基础和进阶功能,配合MySQL驱动,可以快速搭建一个Java项目中的数据库访问层。对于学习和应用Hibernate 3来说,这是...

    Hibernate中文文档+hibernate annotation +distribution

    其次,hibernate-annotations-3.4.0GA是Hibernate支持JPA(Java Persistence API)的重要组成部分,引入了注解方式来声明对象与数据库表之间的映射关系。例如,`@Entity`表示一个类作为数据库中的表,`@Table`定义...

    Struts+Hibernate教程3

    2. **实体类和映射文件**:如何创建Java实体类,编写对应的Hibernate映射文件(hbm.xml),以及使用Annotations进行映射。 3. **DAO设计**:如何编写DAO接口和实现类,包括增删改查的方法,以及使用SessionFactory...

    hibernate-3.6.5.Final-dist.zip

    1. **hibernate3**:核心库文件,包括hibernate-annotations、hibernate-core、hibernate-entitymanager等,用于实现ORM功能。 2. **docs**:官方文档,包括用户指南、API参考和教程,帮助开发者理解和使用Hibernate...

    Getting Started with Hibernate Search

    - `hibernate-commons-annotations.jar`:Hibernate项目的通用工具包。 此外,可选地添加`apache-solr-analyzer.jar`以支持模块化分析器,此JAR来源于SOLR分发包,内含多种分析器,虽然非必需,但强烈建议加入类...

    Hibernate3.2中文手册

    3. **对象关系映射**:深入解析Hibernate的实体类(Entity)、持久化属性(Persistent Properties)、主键(Primary Key)、注解配置(Annotations)以及映射文件(Mapping Files,如.hbm.xml)的使用方法。...

    Hibernate应用开发完全手册(源代码)

    总的来说,《Hibernate应用开发完全手册》提供的源代码涵盖了Hibernate的各个方面,是初学者和进阶者巩固ORM技能的宝贵资源。通过研究这些代码,开发者可以提升自己的编程技巧,解决在项目开发过程中遇到的与数据库...

    Hibernate教程-最全-最好_204页

    《Hibernate教程-最全-最好_204页》是一个深度涵盖Hibernate框架的全面教程,旨在帮助初学者和进阶者深入理解并掌握这一强大的Java持久化技术。在这个204页的教程中,读者将了解到如何利用Hibernate来简化数据库操作...

    王者归来之J2EE Tutorial中文版

    3. **JSF(JavaServer Faces)**:作为MVC(Model-View-Controller)框架,JSF 2.0在JavaEE 6中得到加强,引入了Facelets视图技术、部分刷新和可编程组件模型,使得界面开发更为便捷。 4. **EJB(Enterprise ...

    DWR中文文档.pdf

    **8.1 DWR Annotations** DWR支持注解来简化配置。例如,可以使用注解来标记哪些类或方法可供远程调用。 **8.2 错误和异常处理** DWR提供了一套完善的错误和异常处理机制,可以捕获并报告在远程调用过程中发生的...

    hihi:dsad

    - 企业级应用:EJB、Spring框架、Hibernate等用于构建大型分布式系统。 5. **进阶概念**: - 并发编程:线程、同步、锁、并发容器如ConcurrentHashMap等。 - 泛型(Generics):增强代码类型安全性,减少类型转换...

Global site tag (gtag.js) - Google Analytics