JPA基础(六):大数据字段映射与字段延迟加载

 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的里也经常遇到这问题。

posted @ 2011-11-29 22:10  一直在等  阅读(3699)  评论(0编辑  收藏  举报