整理一下Hibernate中工具的使用

Hibernate中有多种可以生成代码的方法,其中:

1)Java源文件通过XDoclet工具可以生成对象-关系映射文件

2)数据库Schema通过Middlegen工具可以生成对象-关系映射文件

3)对象-关系映射文件通过hbm2java可以生成Java源文件

4)对象-关系映射文件通过hbm2ddl可以生成数据库Schema 

在很多书上发现都用到了hbm2java和Ant进行整合自动生成Java源文件,今天我也来学习学习

将HibernateTools-3.2.0.beta7/plugins/org.hibernate.eclipse_3.2.0.beta7/lib/tools下面的hiberante-tools.jar和freemarker.jar以及HibernateTools-3.2.0.beta7/plugins/org.hibernate.eclipse_3.2.0.beta7/lib/hibernate下面的hibernate3.jar拷贝到lib目录,

在E:/HBMAction建立CarDemo文件夹

在E:/HBMAction/CarDemo建立lib,src子目录以及build.xml文件

      + lib
          一些Hibernate3.2必须的包
     
+ src
          mydemo
                Car.hbm.xml 
          hibernate.cfg.xml
          lo4j.properties
     build.xml
  

Car.hbm.xml的内容如下:

 

<? xml version="1.0" encoding="GB2312" ?>
<! DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
        
< hibernate-mapping >
    
< class  name ="mydemo.Car"  table ="cars" >
        
< meta  attribute ="class-description" >
            一辆简单的汽车
            @author lisiding_1986
        
</ meta >
        
        
< meta  attribute ="class-scope" > public </ meta >
        
        
< id  name ="carID"  type ="long"  column ="car_ID" >
            
< meta  attribute ="scope-set" > protected </ meta >
            
< generator  class ="native"   />
        
</ id >
        
        
< property  name ="carName"  type ="String" >
            
< meta  attribute ="field-description" > 汽车的名字 </ meta >
            
< meta  attribute ="use-in-toString" > true </ meta >
            
< column  name ="car_Name"  sql-type ="varchar(255)"  not-null ="true"   />
        
</ property >
        
        
< property  name ="carNumber"  type ="String" >
            
< meta  attribute ="field-description" > 汽车的车牌号码 </ meta >
            
< meta  attribute ="use-in-toString" > true </ meta >
            
< column  name ="car_Number"  sql-type ="varchar(255)"  not-null ="true"   />
        
</ property >
        
        
< property  name ="carDate"  type ="timestamp" >
            
< meta  attribute ="field-description" > 汽车的生产日期 </ meta >
            
< column  name ="car_Date"  sql-type ="timestamp"   />
        
</ property >
    
</ class >
</ hibernate-mapping >

 

这个对象-关系映射文件包含了如下简要信息:

这个Java源文件的名字叫Car,打包在mydemo包下,有四个字段carID,carName,carNumber,carDate,

这个类是public的,其中的carID字段的set方法是protected

 

接下来写Hibernate配置文件hibernate.cfg.xml

 

<? xml version='1.0' encoding='GB2312' ?>
<! DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

< hibernate-configuration >
    
< session-factory >
        
<!--  数据库连接设置  -->
        
< property  name ="hibernate.connection.driver_class" > com.mysql.jdbc.Driver </ property >
        
< property  name ="hibernate.connection.url" > jdbc:mysql://localhost:3306/test </ property >
        
< property  name ="hibernate.connection.username" > root </ property >
        
< property  name ="hibernate.connection.password" > 12345678 </ property >
        
        
<!--  JDBC连接池  -->
        
< property  name ="hibernate.connection.provider_class" > org.hibernate.connection.C3P0ConnectionProvider </ property >
        
< property  name ="hibernate.c3p0.max_size" > 20 </ property >
        
< property  name ="hibernate.c3p0.min_size" > 5 </ property >
        
< property  name ="hibernate.c3p0.timeout" > 120 </ property >
        
< property  name ="hibernate.c3p0.max_statements" > 100 </ property >
        
< property  name ="hibernate.c3po.idle_test_period" > 120 </ property >
        
< property  name ="hibernate.c3p0.acquire_increment" > 2 </ property >
        
        
<!--  SQL 方言  -->
        
< property  name ="hibernate.dialect" > org.hibernate.dialect.MySQLInnoDBDialect </ property >
        
        
<!--  打开Hibernate的自动Session上下文管理  -->
        
< property  name ="hibernate.current_session_context_class" > thread </ property >
        
        
<!--  在命令窗口显示所有的SQL语句  -->
        
< property  name ="hibernate.show_sql" > true </ property >
        
        
<!--  将SQL语句格式化,更方便查看  -->
        
< property  name ="hibernate.format_sql" > true </ property >
        
        
<!--  在启动的时候删除数据并重新创建  -->
        
< property  name ="hbm2ddl.auto" > create </ property >
        
        
<!--  指定对象-映射文件的位置  -->
        
< mapping  resource ="mydemo/Car.hbm.xml"   />
    
</ session-factory >
    
</ hibernate-configuration >

 

最后就是写build.xml了

 

<? xml version="1.0" encoding="GB2312"  ?>
< project  name ="CarDemo"  default ="hbm2java"  basedir ="." >
    
    
<!--  定义存放SQL语句和Java源文件的根目录  -->
    
< property  name ="build.dir"  value ="build"   />
    
<!--  定义将哪个目录下的jar文件做为编译或生成Java源文件时的classpath  -->
    
< property  name ="build.lib"  value ="${basedir}/lib"   />
    
    
<!--  定义将生成的SQL语句保存到哪个目录  -->
    
< property  name ="build.ddl"  value ="build/ddl"   />
    
    
<!--  定义将生成的Java源文件放入哪个目录  -->
    
< property  name ="build.src"  value ="build/src"   />
    
    
<!--  定义一个path任务,里面有各种jar文件  -->
    
< path  id ="libs" >
        
<!--  将src下面的各种文件也作为classpath  -->
        
< pathelement  location ="${basedir}/src"   />
        
<!--  将各种jar文件作为id libs引用  -->
        
< fileset  dir ="${build.lib}" >
            
< include  name ="*.jar"   />
        
</ fileset >
    
</ path >
    
    
< target  name ="init"  description ="创建一个目标,将上面定义的文件夹创建好" >
        
<!--  执行delete任务,先删除build文件夹 
        <delete dir="${build.dir}" />
        
-->
        
<!--  执行mkdir任务,创建上面定义好的文件夹  -->
        
< mkdir  dir ="${build.dir}"   />
        
< mkdir  dir ="${build.src}"   />
        
< mkdir  dir ="${build.ddl}"   />
    
</ target >
    
    
< target  name ="copy"  depends ="init"  description ="拷贝src下的文件到build.src目录" >
        
< copy  todir ="${build.src}" >
            
< fileset  dir ="${basedir}/src" >
                
< include  name ="**/*.properties"   />
                
< include  name ="**/*.hbm.xml"   />
                
< include  name ="**/*.cfg.xml"   />
            
</ fileset >
        
</ copy >
    
</ target >
    
    
< target  name ="hbm2java"  depends ="copy"  description ="利用对象-关系映射文件生成Java源文件" >
        
< taskdef  name ="hbm2java"
            classname
="org.hibernate.tool.ant.HibernateToolTask"
            classpathref
="libs"   />
        
        
< hbm2java  destdir ="${build.src}" >
            
< configuration  configurationfile ="${build.src}/hibernate.cfg.xml"   />
            
< hbm2java  jdk5 ="true"   />
        
</ hbm2java >
    
</ target >
    
    
< target  name ="hbm2ddl"  depends ="copy"  description ="利用对象-关系映射文件生成SQL语句" >
        
< taskdef  name ="hbm2ddl"
            classname
="org.hibernate.tool.ant.HibernateToolTask"
            classpathref
="libs"   />
        
< hbm2ddl  destdir ="${build.ddl}" >
            
< configuration  configurationfile ="${build.src}/hibernate.cfg.xml"   />
            
< hbm2ddl  export ="true"  
                console
="false"  
                create
="true"  
                update
="false"  
                drop
="false"  
                outputfilename
="car.sql"   />
        
</ hbm2ddl >
    
</ target >
    
    
<!--  将建立的目录删除  -->
    
< target  name ="clean" >
        
< delete  dir ="${build.dir}"   />
    
</ target >

</ project >

 

 

将CMD窗口的命令提示符转到E:/HBMAction/CarDemo,运行ant hbm2java,

可以看到在E:/HBMAction/CarDemo/build/src/mydemo文件夹中生成了Car.java,内容如下:

 

package  mydemo;
//  Generated 2007-12-6 16:30:26 by Hibernate Tools 3.2.0.beta7


import  java.util.Date;

/**
 *             一辆简单的汽车
 *             
@author lisiding_1986
 *         
 
*/

public   class  Car   implements  java.io.Serializable  {

    
// Fields    

     
private long carID;
     
/**
      * 汽车的名字
     
*/

     
private String carName;
     
/**
      * 汽车的车牌号码
     
*/

     
private String carNumber;
     
/**
      * 汽车的生产日期
     
*/

     
private Date carDate;

     
// Constructors

    
/** default constructor */
    
public Car() {
    }


    
/** minimal constructor */
    
public Car(String carName, String carNumber) {
        
this.carName = carName;
        
this.carNumber = carNumber;
    }

    
/** full constructor */
    
public Car(String carName, String carNumber, Date carDate) {
       
this.carName = carName;
       
this.carNumber = carNumber;
       
this.carDate = carDate;
    }

   
    
// Property accessors
    public long getCarID() {
        
return this.carID;
    }

    
    
protected void setCarID(long carID) {
        
this.carID = carID;
    }

    
/**       
     *      * 汽车的名字
     
*/

    
public String getCarName() {
        
return this.carName;
    }

    
    
public void setCarName(String carName) {
        
this.carName = carName;
    }

    
/**       
     *      * 汽车的车牌号码
     
*/

    
public String getCarNumber() {
        
return this.carNumber;
    }

    
    
public void setCarNumber(String carNumber) {
        
this.carNumber = carNumber;
    }

    
/**       
     *      * 汽车的生产日期
     
*/

    
public Date getCarDate() {
        
return this.carDate;
    }

    
    
public void setCarDate(Date carDate) {
        
this.carDate = carDate;
    }





}



说句实话,第一次搞这东西真不容易,在网上找了很多资料,经过长达4个多小时的调试终于生成成功,激动中......

 

下面运行ant hbm2ddl,果然不出我所料,又是一大堆异常,我找了一下异常信息,如下:

  [hbm2ddl] org.hibernate.MappingException: Could not determine type for: String
, for columns: [org.hibernate.mapping.Column(car_Name)]

经过10分钟左右后的调试,终于成功生成SQL语句,如下:

 

create   table  cars (
    car_ID 
bigint   not   null  auto_increment, 
    car_Name 
varchar ( 255 not   null
    car_Number 
varchar ( 255 not   null
    car_Date 
timestamp primary   key  (car_ID)
    ) type
= InnoDB;

 

总结,刚刚接触一个新东西的时候肯定会遇到各种各样的问题,但是只要不放弃,我相信终究会成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值