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
大数据字段映射与字段延迟加载 - **大数据字段**:讨论如何在JPA中处理较大的文本或二进制数据字段。 - **字段延迟加载**:解释字段延迟加载的概念及其实现方法。 #### 10. 对象的加载、更新与删除 - **对象加载...
大数据字段映射与字段延迟加载** 大数据字段如CLOB或BLOB的映射需要特别处理。字段延迟加载是JPA的一个特性,用于提高性能,只在需要时加载相关数据,通过@Lob和基本的懒加载策略实现。 **7. 使用JPA加载_更新_...
2. **延迟加载**(Lazy Loading):在Hibernate中,大字段可以通过懒加载策略来优化,只在真正需要时才从数据库读取,避免了不必要的网络传输和内存占用。 3. **文件存储**:对于非常大的字段,如大文本或多媒体...
然而,对于大字段,我们可能希望延迟加载,直到真正需要时才从数据库获取。为此,可以使用`@Basic(fetch = FetchType.LAZY)`注解或在XML映射中设置`fetch="lazy"`。 2. 立即加载:如果经常需要访问大字段,可以选择...
12. **@Basic(fetch = FetchType.LAZY)**: 结合@Lob使用,用于延迟加载大数据字段,提高性能。 13. **@Repository**: 标记数据访问组件,通常用于DAO层,用于捕获并封装数据访问时的异常。 14. **@Scheduled(cron=...
- **延迟初始化(延迟加载)**:一种性能优化手段,只在真正需要时加载关联数据。 - **集合排序**:对集合中的元素进行排序的映射方式。 - **使用**:一种特殊的集合映射方式,适用于某些场景。 - **双向关联**:...
- **@Column**: 指定字段与数据库列的映射,可以设置列名、长度、是否可为空等属性。 - **@GeneratedValue**: 控制主键生成策略,如.AUTO(自增)、.SEQUENCE(序列)等。 - **@Temporal**: 用于日期时间类型的字段,...
7. **延迟加载**:理解并正确使用Hibernate的延迟加载机制,可以优化性能,避免不必要的数据获取。 **应用专题** 1. **LOB字段处理**:SSH提供了处理大对象(LOB)字段的方法,如BLOB和CLOB,确保大数据类型的存储...
- **懒加载**:延迟加载关联对象,减少初始加载时的数据量。 - **批量加载**:使用批处理减少网络通信次数。 - **缓存机制**:一级缓存自动启用,二级缓存需手动配置。 - **SQL 优化**:调整 SQL 语句以提高执行效率...
6. **性能优化**:处理CLOB数据时,注意避免一次性加载整个CLOB内容到内存中,可以分块读取或延迟加载。 7. **事务管理**:由于CLOB操作可能会涉及到较大的数据量,确保正确设置事务的隔离级别和回滚规则,以防止...
Hibernate包含许多高级特性,如缓存机制(一级缓存和二级缓存)、事务管理、事件监听、延迟加载等,这些特性可以显著提升性能和应用的灵活性。 ### 6. Hibernate最佳实践 - 使用注解进行对象-关系映射,减少XML...
6. **性能优化**:包括使用延迟加载避免不必要的数据加载,使用AsNoTracking提高读取性能(因为不跟踪实体状态),以及适当使用ToList、ToArray等方法提前执行查询,防止大数据集导致的内存问题。 7. **仓储模式...
- **默认值设置**:为可能遇到错误的字段设置默认值可以确保数据流的连续性。 - **使用IIF函数**:IIF函数可用于根据条件返回不同的默认值,这种灵活性有助于增强数据映射的鲁棒性。 3. **状态变量(Variables)**...
- **知识点**:传统数据库遵循“先有模式后有数据”的原则,即首先定义数据库的逻辑结构(如表结构、字段类型等),然后根据这些结构录入数据。而在大数据场景下,由于数据量巨大且种类繁多,通常采用“先有数据后有...
- **映射查看**:查看和编辑索引的字段映射,有助于理解和调整数据结构。 - **监控面板**:展示集群和节点的实时指标,如请求延迟、索引速度等,便于性能监控。 **3. 使用场景** - **故障排查**:当Elasticsearch...
Apache Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL(HQL,Hive Query Language)查询功能,使得用户可以方便地进行大数据分析。Hive的设计目标是使分析师能够通过...