JPA基礎(六):大資料欄位映射與欄位消極式載入

來源:互聯網
上載者:User
 1 import java.util.Date;
2
3 import javax.persistence.Basic;
4 import javax.persistence.Column;
5 import javax.persistence.Entity;
6 import javax.persistence.EnumType;
7 import javax.persistence.Enumerated;
8 import javax.persistence.FetchType;
9 import javax.persistence.GeneratedValue;
10 import javax.persistence.Id;
11 import javax.persistence.Lob;
12 import javax.persistence.Table;
13 import javax.persistence.Temporal;
14 import javax.persistence.TemporalType;
15 import javax.persistence.Transient;
16
17 @Entity
18 @Table(name="PersonTable")
19 public class Person {
20 @Id
21 @GeneratedValue
22 private Integer id;
23 @Column(length=10,nullable=false,name="personname")
24 private String name;
25 @Temporal(TemporalType.DATE)
26 private Date birthday;
27 @Enumerated(EnumType.STRING)
28 @Column(length = 5, nullable = false)
29 private Gender gender = Gender.MAN;
30 @Lob //申明屬性對應的資料庫欄位為一個大文本類,檔案屬性也是用這個宣告對應。
31 private String info;
32 @Lob //聲明屬性對應的是一個大檔案資料欄位
33 @Basic(fetch = FetchType.LAZY) //設定為消極式載入,當我們在資料庫中取這條記錄的時候,不會去取這個欄位
34 private Byte[] file;
35 @Transient//這個註解用來標註imagePath這個屬性不作為可持久化欄位,就是說不跟資料庫的欄位做任何關聯
36 private String imagePath;
37 省略get set方法……
38 }

產生的資料庫欄位類型如下:

假如 private Byte[] file;儲存的是一個檔案,如果我們要擷取一個Person對象的話,會把file這個欄位儲存的內容找回來,並且放在記憶體裡面。(如果我們儲存的檔案有50M,那每次擷取Person bean的時候,都會擷取file這個檔案,在記憶體中可能是50.1M,這樣太佔資源了,怎麼辦?) 可以給file加@Basic(fetch =FetchType.LAZY)這個註解,如果我們設定了消極式載入,那麼當我們調用Hibernate的get方法得到Person這個記錄的時候,如果沒有訪問file這個屬性的get方法的話,那麼它就不會從資料庫裡幫我們把這個file得到;如果說你要訪問這個file屬性,那麼它才會從資料庫裡面把這個file資料裝載上來。也就是說,只要我們不訪問它,那麼它就不會從資料庫裡面把資料裝載進記憶體裡面。 如果不裝載檔案的話,那麼得到的Person記錄可能就是0.1M左右,當然,如果你訪問了file這個屬性的話,那麼它會從資料庫裡面把資料再裝載一次上來,在記憶體裡可能就有50.1M了。所以,@Basic這個標籤一般用在大資料,也就是說你存放的資料大小比較大的話,大概資料如果超過1M的話,就應該使用@Basci標籤,把屬性做延遲初始化,那麼當初次得到Person對象的時候,就不會立刻去裝載資料,而是在第一次訪問的時候才去裝載file資料。當然在第一次訪問file的時候,必須要確保EntityManager這個對象要處於開啟狀態(就好比session對象要處於開啟狀態一樣),假如EntityManager對象被close了的話,我們再訪問它的延遲屬性會出現消極式載入例外,這個在Hibernate的裡也經常遇到這問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.