Hibernate Gossip: 從映射文件生成資料表

 

Hibernate Gossip: 從映射文件生成資料表

在您撰寫好*.hbm.xml映射文件之後,您可以使用org.hibernate.tool.hbm2ddl.SchemaExport來自動建立資料庫表格,假設您的User.hbm.xml如下:

  • User.hbm.xml
 
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">



table="T_USER">












在hibernate.cfg.xml中設定JDBC等相關設定:

  • hibernate.cfg.xml
 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">






true

true

name="dialect">org.hibernate.dialect.MySQLDialect

name="connection.driver_class">com.mysql.jdbc.Driver

name="connection.url">jdbc:mysql://localhost/demo

caterpillar

123456

5
20
1800
50








可撰寫一個程式如下:

  • HbmToTable.java
package onlyfun.caterpillar;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class HbmToTable {
public static void main(String[] args) {
Configuration config = new Configuration().configure();
System.out.println("Creating tables...");
SchemaExport schemaExport = new SchemaExport(config);
schemaExport.create(true, true);
}
}


SchemaExport的create()方法第一個true表示顯示SQL語法至標準輸出,第二個true表示立即在資料庫中運行SQL語法,運行程式之後,將會有以下的結果:

Creating tables...
13:59:23,765  INFO SchemaExport:154 - Running hbm2ddl schema export
13:59:23,781 DEBUG SchemaExport:170 - import file not found: /import.sql
13:59:23,781  INFO SchemaExport:179 - exporting generated schema to database

    drop table if exists T_USER
13:59:24,734 DEBUG SchemaExport:303 -
    drop table if exists T_USER

    create table T_USER (
        id bigint not null auto_increment,
        name varchar(255),
        age bigint,
        primary key (id)
    )
13:59:24,921 DEBUG SchemaExport:303 -
    create table T_USER (
        id bigint not null auto_increment,
        name varchar(255),
        age bigint,
        primary key (id)
    )
13:59:25,046  INFO SchemaExport:196 - schema export complete


生成的資料表如下:

+--------+-----------------+------+------+----------+---------------------+
| Field  | Type            | Null | Key  | Default  | Extra               |
+--------+-----------------+------+------+----------+---------------------+
| id     | int(11)         |      | PRI  | NULL     | auto_increment      |
| name   | varchar(255)    | YES  |      | NULL     |                     |
| age    | int(11)         | YES  |      | NULL     |                     |
+--------+-----------------+------+------+-----------+--------------------+
3 rows in set (0.00 sec)


您也可以在Hibernate設定檔中,加上hbm2ddl.auto的屬性設定為create
...

    create
...


加上以上的設定,在SessionFactory建立的時候,會先刪除資料表,然後進行資料表的建立。
您可以在Classpath下設定一個import.sql,在建立表格之後,接著會載入import.sql的內容,您可以在當中進行表格資料的新增SQL語句。

您還可以使用create-drop設定,這會在每一次SessionFactory關閉時,就刪除資料表。

如果映射HBM檔案隨著專案進行而有所變更,則可以使用SchemaUpdate來直接進行資料表欄位對應更新,例如:

Configuration config = new Configuration().configure();
SchemaUpdate schemaUpdate = new SchemaUpdate(config);
schemaUpdate.execute(true);


這對資料表中己有的欄位不會有影響,如果映射檔案中設定屬性有而
沒有對應的表格欄位,則會在表格上予以新增欄位,true表示在標準輸出中顯示更新的SQL語法,您也可以直接在設定檔的hbm2dll.auto屬性上設定update來達到相同的作用:


    update
...


如果hbm2ddl.auto屬性為validate設定,則會檢查映射檔案中的屬性是否都有對應的表格欄位,如果沒有對應的欄位,則會直接丟出例外,如果使用程式方式控制,則是使用SchemaValidator,例如:

Configuration config = new Configuration().configure();
SchemaValidator schemaValidator = new SchemaValidator(config);
schemaValidator.validate();


如果您想要在ANT中使用標籤來為您進行以上的功能,則您要下載Hibernate Tools,將當中的hibernate-tools.jar加入Classpath之中,然後在建構檔案中如下設定:

  • build.xml














classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="project.classpath"/>




configurationfile="${build.dir}/hibernate.cfg.xml"/>
drop="true"
create="true"
export="true"
outputfilename="helloworld-dll.sql"
delimiter=";"
format="true"/>



如果drop設定為true,則建構開始時,所有的表格都會被移除,如果create設定為true,則所有的表格會隨之重建,如果export設定為true,則SQL會直接在資料庫中運行,outputfilename為產生的SQL所存放之檔案,delimiter為每句SQL後的分隔字元,format設定為true時SQL會適當的排版,以增加可讀性。

你可能感兴趣的:(hibernate)