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的裡也經常遇到這問題。