1. 程式人生 > >淺談JPA的Blob和Clob註解方法

淺談JPA的Blob和Clob註解方法

@Lob 註解屬性將被持久化為 Blog 或 Clob 型別。

  • Clob(Character Large Ojects)型別是長字串型別,具體的java.sql.Clob, Character[], char[] 和 java.lang.String 將被持久化為 Clob 型別。
  • Blob(Binary Large Objects)型別是位元組型別,具體的java.sql.Blob, Byte[], byte[] 和 serializable type 將被持久化為 Blob 型別。
  • @Lob 持久化為Blob或者Clob型別,根據get方法的返回值不同,自動進行Clob和Blob的轉換。
  • 因為這兩種型別的資料一般佔用的記憶體空間比較大,所以通常使用延遲載入的方式,與@Basic標記同時使用,設定載入方式為FetchType.LAZY。

例:
@Lob
public String getFullText() {
   return fullText;  // clob type
}

@Lob
public byte[] getFullCode() {
  return fullCode;  // blog type
}


@Lob 通常與@Basic同時使用,提高訪問速度。 例:

 
@Lob 
@Basic(fetch = FetchType.LAZY) 
@Column(name=" content", columnDefinition="CLOB", nullable=true) 
public String getContent() {
    return content;
}

@Basic 

實體Bean中所有的非Static 非transient的屬性都可以被持久化,沒有定義註解屬性的等價於在其上添加了@Basic註解。
通過@Basic註解可以宣告屬性的獲取策略(lazy與否),預設的是即時獲取(early fetch)。

這裡又討論到了延遲關聯獲取和延遲屬性獲取,通常不需要對簡單屬性設定延遲獲取,如需要定義@Basic(fetch=FetchType.LAZY)


MySQL中TinyText,Text,Mediumtext,Longtext的設定

在MySQL中沒有Clob,用Text代替了,而且分為了tinytext, text,mediumtext,longtext。Blob也按這種方式分成了四種。

那如果使用hbm2ddl的方式自動生成table時,怎麼通過註解分別配置這幾種型別呢?預設都是生成longtext和longblob型別。

跟Oracle等通用的方法目前還沒有找到,經過測試,可以通過@Column(columnDefinition = "mediumtext")這樣的方式實現。

如果自己寫sql指令碼生成表,然後通過JPA來對映的話,以上四種類型的資料庫欄位在不配置columnDefinition時都可以正常工作。