欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Hibernate的配置反向生成数据库  

程序员文章站 2022-07-12 17:26:14
...

利用Hibernate配置文件生成数据库

 

 

目前很多人使用Hibernate作为持久层,如果我们已经写了配置文件poweracl.hbm.xml,则不必再费劲写SQLDDL。除了利用工具 SchemaExport之外,还可以编写程序来自动初始化数据库,并且生成SQL DDL

1.Hibernate配置 文件hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

 

<!-- Generated by MyEclipse Hibernate Tools.                   -->

<hibernate-configuration>

    <session-factory>

        <!--hb在运行时显示实际执行的sql语句 -->

       <property name="show_sql">true</property>

       <!-- 使显示的sql格式化-->

       <property name="format_sql">true</property>

        <property name="connection.username">root</property>

        <property name="connection.url">jdbc:mysql://localhost:3306/hibtest</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="connection.password">netjava</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

     

  <!-- 指明user这个pojo类的映射文件的路径 -->

        <mapping resource="com/hibtest/poweracl.hbm.xml" />

       

    </session-factory>

 

</hibernate-configuration>注意:(1JDBC驱动为com.mysql.jdbc.Driver,可以根据所使用的库而更换。
   2dialect 为数据库方言,根据所使用数据库不同而不同。这里是Mysql

   3jdbc.fetch_size jdbc.batch_size过小会降低性能,这里是建议设置。

  (4mapping文件根据文件所在路径而不同。这里是 放在WEB-INF/classes/com/hibtest/目录下。

  

 

 

  

2.数据库映射配置poweracl.hbm.xml

 


  (2)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

 

<hibernate-mapping>

    <class name="com.hibtest.user" table="user" discriminator-value="W">

       <id name="loginname" type="string">

           <column name="loginname" sql-type="char(16)" not-null="true"></column>

           <generator class="assigned"></generator>

       </id>

       <property name="password" type="string">

           <column name="password" sql-type="varchar(20)"></column>

       </property>

       <property name="name" type="string">

           <column name="name" sql-type="varchar(20)"></column>

       </property>

       <property name="email" type="string">

           <column name="eamil" sql-type="varchar(60)"></column>

       </property>

       <property name="modified" type="date">

             <column name="modifier"></column>

       </property>

       <property name="creater" type="date">

             <column name="creater"></column>

       </property>

       <property name="lastlogin" type="date">

              <column name="lastlogin"></column>    

       </property>

    </class>

</hibernate-mapping>  

说明:具体的poweracl.hbm.xml要根据数据库表而设置,这里只是列举一个user表。

 

3.初始化数据库类

package com.hibtest;

 

import java.io.File;

 

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

 

/**//**

* <p/> vedadou

* Date: 2004-02-25

* Time: 9:40:15

*/

public class InitDB {

static Session session;

 

public static void main(String[] args){

       Configuration config = null;

       Transaction tx = null;

       try {

       config = new Configuration().configure(new File("hibernate.cfg.xml"));

       System.out.println("Creating tables...");

       SchemaExport schemaExport = new SchemaExport(config);

       schemaExport.create(true, true);

       System.out.println("Table created.");

       SessionFactory sessionFactory = config.buildSessionFactory();

       session = sessionFactory.openSession();

       tx = session.beginTransaction();

       tx.commit();

      

       } catch (HibernateException e){

       e.printStackTrace();

       try {

       tx.rollback();

       } catch (HibernateException e1) {

       e1.printStackTrace();

       }

       } finally {

      

       }

       }

      

}

始化之前,应该先手工创建一个空数据库,然后再执行InitDB程序