Hibernate第三篇【主配置文件、映射文件、複合主鍵映射】

前言

目前已經學瞭如何搭建Hibernate的開發環境,以及Hibernate對應的API了…在快速入門還沒講解的就是配置文件是怎麼配置的。所以,本博文主要講解主配置文件以及映射配置文件..java

主配置文件

主配置文件主要配置:mysql

  • 數據庫的信息
  • 其餘參數
  • 加載映射文件

經常使用的配置信息均可以在hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties目錄下能夠找到..sql

數據庫信息

經常使用的配置信息均可以在hibernate.properties文件中找到,所以,咱們來搜索一下:數據庫

這裏寫圖片描述

<!-- 1. 數據庫鏈接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 數據庫方法配置, hibernate在運行的時候,會根據不一樣的方言生成符合當前數據庫語法的sql【大體能夠理解成:不一樣的版本對應的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>

須要咱們注意的是自動建表,其中它有幾個參數:markdown

這裏寫圖片描述

  • create-drop 每次在建立sessionFactory時候執行建立表。當調用sesisonFactory的close方法的時候,刪除表!
  • create 每次都從新建表; 若是表已經存在就先刪除再建立
  • update 若是表不存在就建立; 表存在就不建立;
  • validate (生成環境時候) 執行驗證: 當映射文件的內容與數據庫表結構不同的時候就報錯!

加載映射文件

值得注意的是:mapping的屬性使用的是resource!session

<!--3. 加載映射文件-->
        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>

加載映射文件其實咱們能夠在程序中加載,不必定在配置文件中配置….通常地,咱們在測試的時候通常使用程序的方式去加載映射文件【方便】併發

那麼怎麼在程序中加載映射文件呢?oracle

在Configuration對象中提供了addClass()的方法app

通常地咱們的映射配置文件和JavaBean對象是放在同一個包下的。而且映射文件的命名是有規範的。所以Hibernate是能夠經過提供的JavaBean對象從而找到相對應的映射文件

//獲取加載配置管理類
        Configuration configuration = new Configuration();

        //加載User的映射文件!
        configuration.configure().addClass(User.class);

映射配置文件

映射文件: 映射一個實體類對象; 描述一個對象最終實現能夠直接保存對象數據到數據庫中

一般地,咱們都是一個JavaBean對象對應一個映射配置文件,而且配置文件和JavaBean對象是放在同一個目錄下的

咱們按照快速入門的映射配置文件一步一步來說解:

<!--在domain包下-->
<hibernate-mapping package="zhongfucheng.domain">

    <!--類名爲User,表名也爲User-->
    <class name="User" table="user">

        <!--主鍵映射,屬性名爲id,列名也爲id-->
        <id name="id" column="id">
            <!--根據底層數據庫主鍵自動增加-->
            <generator class="native"/>

        </id>

        <!--非主鍵映射,屬性和列名一一對應-->
        <property name="username" column="username"/>
        <property name="cellphone" column="cellphone"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

<hibernate-mapping>節點

經常使用的屬性:

  • package【要映射的對象所在的包(可選,若是不指定,此文件全部的類都要指定全路徑)】
  • auto-import
    • 默認爲true, 在寫hql的時候自動導入包名
    • 若是指定爲false, 再寫hql的時候必需要寫上類的全名;

<class>節點

class 映射某一個對象的(通常狀況,一個對象寫一個映射文件,即一個class節點)

經常使用的屬性:

  • name【指定要映射的對象的類型】
  • table【指定對象對應的表】
    • 若是沒有指定,默認與對象名稱同樣

<property>節點

property是普通屬性的映射,即JavaBean普通的成員變量屬性就使用property來描述

經常使用的屬性:

  • name 指定對象的屬性名稱
  • column 指定對象屬性對應的表的字段名稱
    • 若是不寫默認與對象屬性一致
  • length 指定字符的長度, 默認爲255
  • type 指定映射表的字段的類型,若是不指定會匹配屬性的類型
    • java類型: 必須寫全名【例:java.lang.String】
      -* hibernate類型: 直接寫類型,都是小寫*

值得注意的是:若是列名稱爲數據庫關鍵字,須要用反引號或改列名。固然啦,咱們通常不使用關鍵字來做爲列名

7———-

<id>節點

id是主鍵映射….

  • name 指定對象的屬性名
  • column 指定對象屬性對應的表的字段名稱

<id>節點下還有子節點<generator class=""/>

主鍵的自動生成策略

  • identity 自增加(mysql,db2)
  • sequence 自增加(序列), oracle中自增加是以序列方法實現**
  • **native 自增加【會根據底層數據庫自增加的方式選擇identity或sequence】
    • 若是是mysql數據庫, 採用的自增加方式是identity
    • 若是是oracle數據庫, 使用sequence序列的方式實現自增加
  • increment 自增加(會有併發訪問的問題,通常在服務器集羣環境使用會存在問題。)

指定主鍵生成策略爲手動指定主鍵的值

  • assigned

指定主鍵生成策略爲UUID生成的值

  • uuid

foreign(外鍵的方式, one-to-one講)


<composite-id>

主鍵通常分爲兩種:

  • 單列主鍵
  • 多列複合主鍵

單列主鍵就是上面那種,那麼若是要使用多列複合主鍵就須要使用<composite-id>節點來配置了

  • 如今我有這麼下面的一個對象,我想使用username和password做爲複合主鍵
public class User2 {

    private String username;
    private String password;
    private String cellphone;

    //各類setter和getter方法 
}
  • 將username和password抽取成一個類—->CompositeKey….必須實現Serializable接口
package zhongfucheng.domain;

/** * Created by ozc on 2017/5/6. */
public class CompositeKey implements Serializable{

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • 在User2中須要指定一個變量來維護這個主鍵對象
package zhongfucheng.domain;

/** * Created by ozc on 2017/5/6. */
public class User2 {

    //在User對象中維護這個主鍵對象
    private CompositeKey key;
    private String cellphone;

    public CompositeKey getKey() {
        return key;
    }

    public void setKey(CompositeKey key) {
        this.key = key;
    }

    public String getCellphone() {
        return cellphone;
    }

    public void setCellphone(String cellphone) {
        this.cellphone = cellphone;
    }
}

測試

public static void main(String[] args) {

        //建立對象
        User2 user2 = new User2();
        CompositeKey compositeKey = new CompositeKey();
        compositeKey.setUsername("123");
        compositeKey.setPassword("123");
        user2.setCellphone("111");
        user2.setKey(compositeKey);

        //獲取加載配置管理類
        Configuration configuration = new Configuration();

        //加載User的映射文件!
        configuration.configure().addClass(User2.class);

        //建立Session工廠對象
        SessionFactory factory = configuration.buildSessionFactory();

        //獲得Session對象
        Session session = factory.openSession();

        //使用Hibernate操做數據庫,都要開啓事務,獲得事務對象
        Transaction transaction = session.getTransaction();

        //開啓事務
        transaction.begin();

        //添加User2對象到數據庫
        session.save(user2);


        //提交事務
        transaction.commit();

        //關閉Session
        session.close();
    }

這裏寫圖片描述

由於Hibernate在取得的時候是須要實現Serializable這個接口的對象的…所以compositeKey必須實現Serializable接口

這裏寫圖片描述

相關文章
相關標籤/搜索