06、大数据字段映射与字段延迟加载
Person.java
?
?? ??假如 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的教程里也经常遇到这问题。