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的里也经常遇到这问题。
相关文章推荐
- JPA学习---第六节:大数据字段映射与字段延迟加载
- JPA 实体字段映射(时间,枚举,延迟加载,@transient)
- JPA之大数据字段映射与字段延迟加载
- JPA基础(五):日期_枚举等字段类型的JPA映射
- Hibernate 5 & JPA 2.1 延迟加载大字段属性
- hibernate 普通字段延迟加载无效的解决办法(如:Lazy Fetch Blob)
- UI基础-UITableViewHeaderFooterView组标题数据不加载,好友列表只能点击不能打开
- JPA 延迟加载
- 【java基础 5】树形结构数据加载的思考
- dhtml xgrid实现前台大数据延迟加载效果
- JPA 无法加载独立JAR包中实体映射文件 unkonwn entity
- 【EF学习笔记06】----------加载关联表的数据 延迟加载
- mybatis入门基础(七)----延迟加载
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
- ADF(UI)--<af:table>数据的延迟加载(三)
- spring解决JPA因EntityManager关闭导致的延迟加载例外有关问题
- 基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”
- 一个延迟加载Tree数据的例子 .
- hibernate的映射和延迟加载--第四天
- 在ViewPager+Fragment实现Tabhost基础之上实现滑动到当前Fragment加载网络数据