程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> hibernate映射學習(一)

hibernate映射學習(一)

編輯:DB2教程

hibernate映射學習(一)


今天這篇博客將會主要學習hibernate關於實體類和表格中的映射詳細學習。首先看下”常用主鍵的生成策略”

hibernate常用主鍵生成策略

在hibernate中,每個主鍵必須定義相應的主鍵生成策略,它用來為持久化類實例生成唯一的標識。
1.assigned
在hibernate中,如果不想使用hibernate的主鍵生成策略,那麼此時就需要自己指定主鍵,此時的主鍵生成策略,就需要使用assigned。
在使用assigned的時候,必須手動指定id,比如我連續兩次執行如下代碼:

transaction = session.beginTransaction();
UserInfo info = new UserInfo();
info.setUserName("aa");
info.setUserPass("vvv");
session.save(info);
transaction.commit();

當第一次執行的時候,此時主鍵id,默認是0,而第二次執行,由於我們沒有自己指定id,所以還是會使用默認值的,所以hibernate會拋出如下異常:
這裡寫圖片描述
2.increment
這裡使用hibernate的主鍵自增的生成策略,主要為long,short或者int類型生成唯一標識,只有在沒有其他進程給同一張表中插入數據才能使用,在集群下不要使用,不依賴數據庫。比如這次給userinfo的主鍵使用increment。


    
    

此時我在多次執行上面的插入方法,就不會拋出異常,因為此時是主鍵自增的。在指定為increment的時候,當插入的時,hibernate首先在數據庫當中查詢最大的id值,然後對該id加一,再次插入。
3.native和identity
代表主鍵自增的意思,根據數據庫不同,hibernate自動選擇不同的實現方式。
4.hilo
使用一個高/低位算法高效生成long,short或者int類型的標識符,給定一個表和字段(默認分別是hibernate_unique_key和next_hi)作為高位值的來源,高/低位算法生成的標識符,只在一個特定的數據庫當中是唯一的。


    

這裡我們制定id的生成策略是hilo,此時兩次執行插入操作:

transaction = session.beginTransaction();
UserInfo info = new UserInfo();
info.setUserName("aa");
info.setUserPass("vvv");
session.save(info);
transaction.commit();

此時,hibernate為我們額外生成了一張表:hibernate_unique_key在該表中一個字段next_hi
這裡寫圖片描述
可以看到,此時hibernate自動為我們生成主鍵
這裡寫圖片描述
上面說了,默認維護主鍵的表示hibernate_unique_key,不過我們也可以自己指定。
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:sql;"> testprimarytestcolumn

5.uuid
uuid表示為string類型的屬性生成主鍵,並且生成的主鍵也是一個唯一的字符串。比如我將userinfo的實體類的id更改為string類型。主鍵生成策略指定為uuid


    
    

此時多次執行插入操作:
這裡寫圖片描述
6.聯合主鍵生成策略
如果使用聯合主鍵生成策略,就不能像之前那樣使用簡單的兩個字段來代替了,此時必須使用一個實現Serializable接口的實體類。

package com.mydb.entity;

import java.io.Serializable;

public class ComposeKey implements Serializable {
    private int userId;
    private String userAddress;
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((userAddress == null) ? 0 : userAddress.hashCode());
        result = prime * result + userId;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ComposeKey other = (ComposeKey) obj;
        if (userAddress == null) {
            if (other.userAddress != null)
                return false;
        } else if (!userAddress.equals(other.userAddress))
            return false;
        if (userId != other.userId)
            return false;
        return true;
    }

}

可以看到這裡,我使用userId和userAddress這兩個字段來保證聯合主鍵,主要ComposeKey必須實現hashCode和equals方法,因為hibernate是使用這兩個方法來比較兩個對象是否相等,從而保證聯合主鍵的唯一性。
此時UserInfo類內容如下:

package com.mydb.entity;

import java.io.Serializable;

public class UserInfo implements Serializable {
    private ComposeKey composeKey;
    private String userName;
    private String userPass;

    public ComposeKey getComposeKey() {
        return composeKey;
    }
    public void setComposeKey(ComposeKey composeKey) {
        this.composeKey = composeKey;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }
}

接下來就是配置聯合主鍵了。UserInfo.hbm.xml




    
    
        
            
            
        
        
        
    
    

此時,執行插入操作,由於使用了聯合主鍵,相當於我們自己指定了主鍵,需要顯示的set來設置主鍵:

transaction = session.beginTransaction();
UserInfo info = new UserInfo();
info.setComposeKey(new ComposeKey(1,"china"));
info.setUserName("aa");
info.setUserPass("vvv");
session.save(info);
transaction.commit();

這裡寫圖片描述
可以看到這個時候userId和userAddress這兩個屬性,聯合用來作為userInfo表中的主鍵的。此時如果我在插入一條id是info.setComposeKey(new ComposeKey(1,”china”));這樣的數據,hibernate就會為我們拋出如下異常:
這裡寫圖片描述

屬性的映射

對於屬性的映射,常見的屬性如下:
1.name:對應類的屬性名稱
2.type:指定屬性的類型,一般情況下可以不使用,有hibernate自動匹配
3.length:指定長度
4.column:指定屬性所對應的數據庫字段的名稱,如果不指定,就是屬性的名稱
5.not-null:是否非空
6.unique:是否唯一
7.update:是否在發出update語句的時候,包含本屬性
當需要存入一個很長的文本,比如一本小說的時候,需要指定type類型為”text”,這種類型只受硬盤大小的限制。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved