您的位置:首页 > 大数据

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

2011-11-29 22:10 351 查看
import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name="PersonTable")
public class Person {
@Id
@GeneratedValue
private Integer id;
@Column(length=10,nullable=false,name="personname")
private String name;
@Temporal(TemporalType.DATE)
private Date birthday;
@Enumerated(EnumType.STRING)
@Column(length = 5, nullable = false)
private Gender gender = Gender.MAN;
@Lob //申明属性对应的数据库字段为一个大文本类,文件属性也是用这个声明映射。
private String info;
@Lob //声明属性对应的是一个大文件数据字段
@Basic(fetch = FetchType.LAZY) //设置为延迟加载,当我们在数据库中取这条记录的时候,不会去取这个字段
private Byte[] file;
@Transient//这个注解用来标注imagePath这个属性不作为可持久化字段,就是说不跟数据库的字段做任何关联
private String imagePath;
省略get set方法……
}


生成的数据库字段类型如下:



假如 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的里也经常遇到这问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: