淺談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時都可以正常工作。