Person.java
package cn.itcast.bean;
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.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import java.util.Date;
@Entity
//以javax开发的包,都是Sun公司制定的一些规范
@Table(name = "PersonTable")
public class Person {
private Integer id;
private String name;
private Date birthday;
private Gender gender = Gender.MAN; // 这里可以设置默认值
private String info;
private Byte[] file;
private String imagePath; //该属性不希望成为可持久化字段
@Transient //这个注解用来标注imagePath这个属性不作为可持久化字段,就是说不跟数据库的字段做任何关系映射
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
@Lob //申明属性对应的数据库字段为一个大文本类,文件属性也是用这个声明映射。
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Lob //声明属性对应的是一个大文件数据字段。
@Basic(fetch = FetchType.LAZY) //设置为延迟加载,当我们在数据库中取这条记录的时候,不会去取这个字段。一般用在大字段属性设置。读取记录的时候不加载,第一次访问这个属性的时候加载(前提是EntityManager还没有关闭)
public Byte[] getFile() {
return file;
}
public void setFile(Byte[] file) {
this.file = file;
}
@Enumerated(EnumType.STRING)
@Column(length = 5, nullable = false)
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Person() {
/* 对象是由Hibernate为我们创建的,当我们通过ID来获取某个实体的时候,这个实体给我们返回了这个对象的创建是由Hibernate内部通过反射技术来创建的,反射的时候用到了默认的构造函数,所以这时候必须给它提供一个public的无参构造函数。*/
}
public Person(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
// auto是默认值,可不写
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 10, nullable = false, name = "personName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
生成的数据库字段类型如下:
假如 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的教程里也经常遇到这问题。
- 大小: 29.3 KB
分享到:
相关推荐
06_传智播客JPA详解_大数据字段映射与字段延迟加载
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第6讲 大数据字段映射与字段延迟加载.avi
将数据库字段映射成类代码 数据库简单的操作 等等
用OO4O操作Oracle数据库的大数据字段.pdf
用OO4O操作Oracle数据库的大数据字段 (1).pdf
ABAP JSON 字段名映射 name_mappings支持字段名大写,小写,驼峰等。 完整代码,可以直接运行。
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。接下来通过本文给大家分享Oracle的CLOB大数据字段类型操作方法,感兴趣的朋友一起看看吧
将模板用arcmap打开(注意:要选择内容列表-按绘制顺序列出显示图层),点击此功能,系统自动读取模板的字段(字段属性包括字段名称,字段类型,字段长度,字段精度,保留小数位)存储到选择的txt文件中(自己添加也...
OpenStreetMap的跨平台,离线,字段映射工具
大数据审计分析快速定位表及字段方法 | 7 着大数据时代 的到来 , 审计工作在处理 、 分析海量数 f 据时面临着新的挑战。大型数据库动辄包含几百上 千张表 , 审计人员如何在时间和人力有限的情况下 , 快速 分析...
文章目录简介示例注意事项 ...#给example索引添加字段映射,默认docs类型 PUT example/docs/_mapping { properties: { id:{ type:long }, name:{ type:keyword }, age:{ type:integer },
解决在springboot+mybatis+postgresql时,数据库字段类型为json时,如何与mybatis进行映射
修改映射配置文件,将需要延迟加载的字段增加lazy属性并设置成true; 2.与实体和集合类型的延迟加载不同,Hibernate3属性延迟加载机制在配置外,还需要用类增强器对二进制Class文件进行强化处理(借助ANT)
LigerGrid动态加载字段列名。
05_JPA详解_日期_枚举等字段类型的JPA映射.zip 05_JPA详解_日期_枚举等字段类型的JPA映射.zip
数据库表不完全一样的实时同步:比如需定义字段映射,或生成一些辅助字段(比如拼音码,简拼,简单计算映射等); 本项目基于canal 1.0.24最新版基础上修改,扩展了服务端和客户端的一些功能,主要包含: 客户端:...
库表在WEB中的实体表映射,在实体表映射中需要将将各个字段做封装。
将数据库mysql中的表,映射到pojo类,数据库中的字段和pojo类属性一致