Hibernate.cfg.xmljava
主配置文件中主要配置:數據庫鏈接信息、其餘參數、映射信息!mysql
經常使用配置查看源碼:sql
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties數據庫
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 一般,一個session-factory節點表明一個數據庫 --> <session-factory> <!-- 1. 數據庫鏈接配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hib_demo?useUnicode=true&characterEncoding=UTF8</property> <property name="hibernate.connection.username">用戶名</property> <property name="hibernate.connection.password">密碼</property> <!-- 數據庫方法配置,hibernate在運行的時候,會根據不一樣的方言生成符合當前數據庫語法的sql --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 2. 其餘相關配置 --> <!-- 2.1 顯示hibernate在運行時候執行的sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 2.3 自動建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 3. 加載全部映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
例如:api
## MySQL服務器
#hibernate.dialect org.hibernate.dialect.MySQLDialectsession
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect併發
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialectoracle
#hibernate.connection.driver_class com.mysql.jdbc.Driverapp
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
<!-- 1. 數據庫鏈接配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hib_demo?useUnicode=true&characterEncoding=UTF8</property> <property name="hibernate.connection.username">用戶名</property> <property name="hibernate.connection.password">密碼</property> <!-- 數據庫方法配置,hibernate在運行的時候,會根據不一樣的方言生成符合當前數據庫語法的sql --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
Hibernate.properties
#hibernate.hbm2ddl.auto create-drop 每次在建立sessionFactory時候執行建立表;
當調用sesisonFactory的close方法的時候,刪除表!
#hibernate.hbm2ddl.auto create 每次都從新建表; 若是表已經存在就先刪除再建立<property name="hibernate.hbm2ddl.auto">create</property>
#hibernate.hbm2ddl.auto update 若是表不存在就建立; 表存在就不建立; <property name="hibernate.hbm2ddl.auto">update</property>
#hibernate.hbm2ddl.auto validate (生成環境時候) 執行驗證: 當映射文件的內容與數據庫表結構不同的時候就報錯!
<!-- 2. 其餘相關配置 --> <!-- 2.1 顯示hibernate在運行時候執行的sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 2.3 自動建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 3. 加載全部映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/>
當使用
// 建立sf對象 sf = new Configuration() .configure() .addClass(User.class) //(測試) 會自動加載映射文件:Employee.hbm.xml .buildSessionFactory();
用以上語句能夠 不用在主配置文件中 寫 <!-- 3. 加載全部映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/>
public class App_ddl { // 自動建表 @Test public void testCreate() throws Exception { // 建立配置管理類對象 Configuration config = new Configuration(); // 加載主配置文件 config.configure(); // 建立工具類對象 SchemaExport export = new SchemaExport(config); // 建表 // 第一個參數: 是否在控制檯打印建表語句 // 第二個參數: 是否執行腳本 export.create(true, true); } }
單列主鍵映射
多列做爲主鍵映射
主鍵生成策略,查看api: 5.1.2.2.1. Various additional generators
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 映射文件: 映射一個實體類對象; 描述一個對象最終實現能夠直接保存對象數據到數據庫中。 --> <!-- package: 要映射的對象所在的包(可選,若是不指定,此文件全部的類都要指定全路徑) auto-import 默認爲true, 在寫hql的時候自動導入包名 若是指定爲false, 再寫hql的時候必需要寫上類的全名; 如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list(); --> <hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true"> <!-- class 映射某一個對象的(通常狀況,一個對象寫一個映射文件,即一個class節點) name 指定要映射的對象的類型 table 指定對象對應的表; 若是沒有指定表名,默認與對象名稱同樣 --> <class name="Employee" table="employee"> <!-- 主鍵 ,映射--> <id name="empId" column="id"> <!-- 主鍵的生成策略 identity 自增加(mysql,db2) sequence 自增加(序列), oracle中自增加是以序列方法實現 native 自增加【會根據底層數據庫自增加的方式選擇identity或sequence】 若是是mysql數據庫, 採用的自增加方式是identity 若是是oracle數據庫, 使用sequence序列的方式實現自增加 increment 自增加(會有併發訪問的問題,通常在服務器集羣環境使用會存在問題。) assigned 指定主鍵生成策略爲手動指定主鍵的值 uuid 指定uuid隨機生成的惟一的值 foreign (外鍵的方式, one-to-one講) --> <generator class="uuid"/> </id> <!-- 普通字段映射 property name 指定對象的屬性名稱 column 指定對象屬性對應的表的字段名稱,若是不寫默認與對象屬性一致。 length 指定字符的長度, 默認爲255 type 指定映射表的字段的類型,若是不指定會匹配屬性的類型 java類型: 必須寫全名 hibernate類型: 直接寫類型,都是小寫 --> <property name="empName" column="empName" type="java.lang.String" length="20"></property> <property name="workDate" type="java.util.Date"></property> <!-- 若是列名稱爲數據庫關鍵字,須要用反引號或改列名。 --> <property name="desc" column="`desc`" type="java.lang.String"></property> </class> </hibernate-mapping>
User 類 主鍵須要單獨爲類
public class User { // 名字跟地址,不會重複 private CompositeKeys keys; private int age; public CompositeKeys getKeys() { return keys; } public void setKeys(CompositeKeys keys) { this.keys = keys; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
主鍵類:必須實現 序列化
import java.io.Serializable; // 複合主鍵類 public class CompositeKeys implements Serializable{ private String userName; private String address; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true"> <class name="User"> <!-- 複合主鍵映射 --> <composite-id name="keys"> <key-property name="userName" type="string"></key-property> <key-property name="address" type="string"></key-property> </composite-id> <property name="age" type="int"></property> </class> </hibernate-mapping>