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自動建立表結構和索引,當然一些初始化資料需要手工匯入。