1. 程式人生 > >Hibernate自動建立表

Hibernate自動建立表

Hibernate支援自動建表,在開發階段很方便,可以保證hbm與資料庫表結構的自動同步。

一、通過Hibernate的ShemaExport來建立

1)實體類

package com.xiaomo.vo;
public class User {
private int id;// 使用者id
private String name;// 使用者名稱稱
private int age;// 使用者年齡
@Override
public String toString() {
return "id:"+this.id+"\tname:"+this.name+"\tage"+this.age;
}
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

2)、User.hbm.xml檔案:

<?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元素來定義一個持久化類 -->
<class name="com.xiaomo.vo.User" table="user">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>

3)、hibernate.cfg.xml檔案:

<!--表明解析本XML檔案的DTD文件位置,DTD是Document Type Definition 的縮寫,即文件型別的定義,XML解析器使用DTD文件來檢查XML檔案的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在 Hibernate3.2.5軟體包中的src\org\hibernate目錄中找到此檔案-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!--宣告Hibernate配置檔案的開始-->
<hibernate-configuration>
<!-- 表明以下的配置是針對session-factory配置的,sessionFactory是hibernate中的一個類,這個類主要負責
儲存hibernate的配置資訊,以及對session的操作 -->
<session-factory>
<!-- 配置資料庫的驅動程式,hibernate在連線資料庫時,需要用到資料庫的驅動程式 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 設定資料庫的連線url:jdbc:mysql://localhost:3306/xiaomo,其中localhost表示說mysql的伺服器名稱,此處為本機。
port代表mysql伺服器的埠號,預設為3306.xiaomo是資料庫名,這是你要連線的資料庫名 -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/lili
</property>
<!-- 如果你的mysql伺服器都是預設設定的,且裝在本機上則也可以寫成
jdbc:mysql://localhost/xiaomo
或者是
jdbc:mysql:///test
-->
<!-- 連線資料庫的使用者名稱 -->
<property name="hibernate.connection.username">
root
</property>
<!-- 連線資料庫的密碼 -->
<property name="hibernate.connection.password">
cd_hisome
</property>
<!-- Hibernate使用的資料庫方言,就是要用hibernate連線哪種型別的資料庫伺服器 -->
<property name="dialect">  
            org.hibernate.dialect.MySQLDialect  
        </property>  
<!-- hibernate.hbn2ddl.auto指定由java程式碼生成資料庫指令碼,進而生成具體的表結構的具體方式 -->
<property name="hbn2ddl.auto">update</property>
<!-- 是否在後臺顯示Hibernate生成的查詢資料庫的SQL語句,開發時設定為true,便於查詢錯誤,執行時
可以在Eclipse的控制檯顯示Hibernate執行的sql語句。專案部署後可以設定為false,提高執行效率 -->
<property name="show_sql">true</property>
<!-- 指定對映檔案為“com/xiaomo/vo/User.hbm.xml” -->
<mapping resource="com/xiaomo/vo/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

4)、測試類:

package com.xiaomo.test;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class CreateTable {
public static void main(String[] args) {
//讀取配置檔案hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//建立SchemeExport例項
SchemaExport sExport = new SchemaExport(cfg);
//建立資料庫表
sExport.create(true, true);
}
}

結果:

drop table if exists user
create table user (id integer not null auto_increment, name varchar(255), age integer, primary key (id))

這個時候檢視資料庫,可以看到表已經自動建立完畢。

二、在hibernate.cfg.xml里加上如下程式碼(這個方式網路上記載來的)

Xml程式碼<property name="hbm2ddl.auto">update</property>  

1、update:表示自動根據model物件來更新表結構,啟動hibernate時會自動檢查資料庫,如果缺少表,則自動建表;如果表裡缺少列,則自動新增列。

還有其他的引數: 
2、create:啟動hibernate時,自動刪除原來的表,新建所有的表,所以每次啟動後的以前資料都會丟失。

3、create-drop:啟動hibernate時,自動建立表,程式關閉時,自動把相應的表都刪除。所以程式結束時,表和資料也不會再存在。

注意:資料庫要預先建立好,因為hibernate只會建表,不會建庫


表結構和資料總是在程式執行的時候無端的修改,折騰了好長時間,查了很長時間hibernate的資料庫對映檔案和介面程式,始終沒有發現有什麼錯誤,到最後才發現了它!
           <property name="hibernate.hbm2ddl.auto" value="update" />
解釋如下:

hibernate.hbm2ddl.auto Automatically validate or export schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly. eg. validate | update | create | create-drop

其實這個引數的作用主要用於:自動建立|更新|驗證資料庫表結構。
如果沒有此方面的需求建議set value="none".

其它幾個引數的意思:

validate               載入hibernate時,驗證建立資料庫表結構
create                  每次載入hibernate,重新建立資料庫表結構
create-drop        載入hibernate時建立,退出是刪除表結構
update                 載入hibernate自動更新資料庫結構

如果發現數據庫表丟失或新增,請檢查hibernate.hbm2ddl.auto的配置 可設定 <property name="hibernate.hbm2ddl.auto" value="none" />

建議在開發環境下使用,在生產環境下去掉。

hibernate自動建立表的優缺點:

一、優點:

1、自動建立新表

2、自動建立新欄位

3、自動修改欄位型別

二、缺點:

1、不會自動刪除表

2、不會自動刪除欄位

3、自動建立的新欄位只能是在最後。

針對缺點的建議:定期把資料庫清空(刪除所有表),然後啟動專案,讓hibernate自動建立表結構和索引,當然一些初始化資料需要手工匯入。