当前位置:编程学习 > JAVA >>

学习JPA——Hibernate Annotation使用实例

 目前,JPA(Java Persistence API)的使用范围越来越广,作为Java EE 5.0平台标准的ORM规范,得到了诸如:Hibernate、TopLink、OpenJpa等ORM框架的支持,同时还是EJB 3.0的重要组成部分。JPA的宗旨是为POJO提供持久化标准规范。它能够脱离容器独立运行,方便开发和测试。本文将通过一个小实例来说明如何在Hibernate中使用JPA,来达到简化编程的目的。
    开发环境  Eclipse 3.3.1  MyEclipse 6.0.1GA  Tomcat 6.10  SQL Server 2000
            hibernate-3.2.5.GA  hibernate-annotations-3.3.0.GA
            ejb3-persistence  hibernate-commons-annotations-3.0.0.GA
    本文是让大家了解一下相比与以前的Hibernate ORM映射的不同之处,以及采用JPA所带来的好处。
    为了保证程序能顺序运行,避免不同的Eclipse版本之间产生错误,大象强烈建议,下载源码后,按源码中的工程名,自己单独新建同一个工程,再将src和WEB-INF/lib目录下的所有文件COPY至对应的目录下。
    1、创建Web Project
       点击"File"->"New",选择"Web Project",在"Project Name"中输入ajax,点击"Finish"。下载本文后面需要用到的JAR包,加入到WEB-INF/lib目录下,在ajax工程中,文本采用的是UTF-8编码。
    2、创建HibernateSessionFactory
       传统的方法就是在工程名上点右键,选择”MyEclipse”->”Add Hibernate Capabilities”,然后就是按照提示一步一步做,不过在MyEclipse 6.0.1中添加Hibernate还是只能支持3.1,除非你选择” Add Spring Capabilities”,里面才有Hibernate 3.2的类库,要想完全兼容JPA,必须采用3.2以上版本。

\
   
       这里大家直接使用源码中的HibernateSessionFactory,注意请先建包:com.ajax.core,HibernateSessionFactory中有一个地方需要改动,原来的写法是:
    private static Configuration configuration = new Configuration();
       修改后为:
    private static AnnotationConfiguration configuration = new AnnotationConfiguration();
       因为我们采用的是JPA注释方式来映射实体,另外AnnotationConfiguration这个类在hibernate-annotations.jar这个包中。
    3、创建BaseDao
       在com.ajax.core包下面新建BaseDao抽象类,里面定义的是持久化操作方法,有一点特别要注意,一定要在增加、删除、修改这几个方法中加入事务控制,不管是在BaseDao基类方法中加,还是在业务方法中加,一定要加事务控制,大象觉得在基类中加会比较好一点,这样做代码显得更少更简洁。如果不加事务控制,那么增、删、改这些操作都不会产生效果,因为默认情况下,它不会进行自动提交。在做这个例子的时候,这个问题曾经困扰了我好长时间。因此,请大家记住不要再犯和大象一样的错误!贴出部分代码,详情请看源码,里面有很全面的注释。
/**
 * 抽象Dao类,用于持久化操作
 * @author 菠萝大象
 * @version 1.0
 */
public abstract class BaseDao<T> {

    private static Log log = LogFactory.getLog(BaseDao.class);
   
    /**
     * 获取Hibernate的Session对象
     */
    public Session getSession(){
        return HibernateSessionFactory.getSession();
    }
   
    /**
     * 根据主键得到对象
     */
    public T getObject(Class clazz, Serializable id){
        return (T)getSession().get(clazz, id);
    }
   
    /**
     * 保存对象
     */
    public void saveObject(T t) {
        Session session = getSession();
        Transaction tx = beginTransaction(session);
        try{
            session.saveOrUpdate(t);
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            log.error("保存对象失败");
        }
    }
   
    /**
     * 创建事务
     */
    private Transaction beginTransaction(Session session){
        return session.beginTransaction();
    }
}
    4、创建Employee
       在com.ajax.employee.mode包下新建Employee类,这个就是POJO类,下面来详细说明里面的含义。
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements java.io.Serializable{
   
    private Integer employee_id; //人员ID(主键)
    private String employee_name; //人员姓名
    private String sex; //性别
    private String birthday; //出生日期
    private String address; //地址
   
    @Id
    @Column(name = "EMPLOYEE_ID")
    @TableGenerator(
         name="tab-store",
         table="GENERATOR_TABLE",
         pkColumnName = "G_KEY",
         pkColumnValue="EMPLOYEE_PK",
         valueColumnName = "G_VALUE",
         allocationSize=1
    )
    @GeneratedValue(strategy = GenerationType.TABLE,generator="tab-store")
    public Integer getEmployee_id() {
        return employee_id;
    }
    public void setEmployee_id(Integer employee_id) {
        this.employee_id = employee_id;
    }
}
       其它几个属性的getter和setter省略,这里我们要用到ejb3-persistence.jar,JPA的注解类就在这个包中,下面详细说明上面使用到的注解。
      @Entity:通过@Entity注解将一个类声明为一个实体bean
      @Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)
      @Id:用于标记属性的主键
      @Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如:
    @Column(name = "EMPLOYEE_NAME")
    private String employee_name;
       或者
    @Column(

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,