hibernate 普通字段延迟载入无效的解决的方法
关联对象的延迟载入就不说了。大家都知道。
关于普通字段的延迟载入,尤其是lob字段,若没有延迟载入,对性能影响极大。然而简单的使用 @Basic(fetch = FetchType.LAZY) 注解并没有效果。hibernate对此的解释是Lazy property loading requires buildtime bytecode instrumentation. If your persistent classes are not enhanced, Hibernate will ignore lazy property settings
and return to immediate fetching.
而bytecode instrumentation的介绍能够參考http://www.correlsense.com/blog/java-bytecode-instrumentation-an-introduction/,本文不多作介绍。
正是由于我们的persistent classes没有使用bytecode instrumentation增强,才导致了普通字段无法延迟载入。
因此要改写一下。下面为一个使用了bytecode instrumentation的持久类:
public class PublicSchemeTaskFile implements java.io.Serializable , FieldHandled { // Fields /**
*
*/
private static final long serialVersionUID = -8297912895820802249L;
private Integer id;
private PublicTask publicSchemeTask;
private Integer fileType;
private String fileName;
private byte[] content; private FieldHandler fieldHandler;//用于延迟载入表字段。关联对象延迟载入的话无需此技术 @JSON(serialize = false)
public FieldHandler getFieldHandler() {
return fieldHandler;
} public void setFieldHandler(FieldHandler fieldHandler) {
this.fieldHandler = fieldHandler;
}
// Constructors /** default constructor */
public PublicSchemeTaskFile() {
} /** minimal constructor */
public PublicSchemeTaskFile(Integer id) {
this.id = id;
} // Property accessors
@Id @Column(name="ID", unique=true, nullable=false, precision=22, scale=0)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "PUBLIC_SCHEME_TASK_FILE_SEQ")
public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
}
@JSON(serialize = false)
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="PUBLIC_TASK_ID") public PublicTask getPublicSchemeTask() {
return this.publicSchemeTask;
} public void setPublicSchemeTask(PublicTask publicSchemeTask) {
this.publicSchemeTask = publicSchemeTask;
} @Column(name="FILE_TYPE", precision=22, scale=0) public Integer getFileType() {
return this.fileType;
} public void setFileType(Integer fileType) {
this.fileType = fileType;
} @Column(name="FILE_NAME", length=50) public String getFileName() {
return this.fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
}
@JSON(serialize = false)
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name="CONTENT") public byte[] getContent() {
if (fieldHandler != null) {
return (byte[]) fieldHandler.readObject(this, "content", content);
}
return null;
} public void setContent(byte[] content) {
this.content = content;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PublicSchemeTaskFile other = (PublicSchemeTaskFile) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
} }
关键在于FieldHandled接口和lob字段的getter
hibernate 普通字段延迟载入无效的解决的方法的更多相关文章
- hibernate之4.延迟载入
延迟载入: 仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库 get不支持延迟载入 @Test public void getTest(){ Session session=n ...
- java运行shell命令,chmod 777 xxx,改变权限无效的解决的方法。
在java程序中运行shell命令,改变文件的权限.能够在命令行中运行 chmod 777 <span style="font-family: Arial, Helvetica, sa ...
- 解决的方法:mysql_connect()不支持请检查mysql模块是否正确载入
故障现象:linux 安装discuz 错误提示:mysql_connect() 不支持请检查mysql模块是否正确载入. 解决的方法:查看/usr/lib/php/modules/ (64位的看/u ...
- Hibernate中的session和load延迟载入矛盾问题,怎样解决?
假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter> <filter-n ...
- Hibernate 延迟载入
一.延迟载入定义 延迟载入,也叫懒载入,它是Hibernate为提高程序运行效率而提供的一种机制,即当仅仅有真正使用该对象的数据时才会创建. 说白了,所谓的延迟载入不是 ...
- hibernate手动设置的id无效的原因与解决方法
在使用Hibernate的过程中,发现手动设置的id(主键)无效,Hibernate仍然会在保存(调用Hibernate提供的merge()方法)的时候自动生成一个随机的id. 经过调试发现问题出在了 ...
- 设置height:100%无效的解决方法
设置height:100%无效的解决方法 刚接触网页排版的新手,常出现这种情况:设置table和div的高height="100%"无效,使用CSS来设置height:" ...
- [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系
[转]Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系 1.如表Class(ClassID,Class_No,ClassName)与Student(S ...
- 原声JS瀑布流加延迟载入
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Jquery课堂上课了,第一节Jquery选择器$
Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict(); jQue ...
- Unity Android交互过坑指南
Unity Android交互过坑指南 介于网上看过很多unity和Android交互的教程,都或多或少的漏掉了一些部分,导致编译过程中出现各种问题,特此整理一份教程,仅供参考 介绍 本次实现的是在游 ...
- Ambari?自动部署Hadoop集群
自动部署?Ambari Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是顶级项目.就 Ambari 的作用来说,就是创建 ...
- js面试笔试题
1. Js的Typeof返回类型有那些? string:undefined:number; function:object:boolean:symbol(ES6) 2. null和undefined的 ...
- JS——if条件判断
现在只说特殊情况: 1.一个变量,例如n1=null <script> var n1 = null; alert(n1);/*弹窗的值为null*/ if (n1 == null) {/* ...
- cmd 启动mysql环境变量配置
win10系统:(其他系统类似,改环境变量就可以) 1.我的电脑,右键选择属性,进入系统页面 2.点击高级系统设置,进入系统属性页面 3.点击高级选项卡,点击环境变量,进入环境变量设置 4.选择系统变 ...
- MyEclipse快捷键 (精简)
在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当需要恢复代码功能的时候,又可以用Ctrl+/ 去掉注释.这 ...
- Django 更新字段
Django在1.7以后的版本提供数据迁移命令,用来在修改模型中的字段,更新到数据库 1. python manager.py makemigrations 命令用来创建迁移文件版本的 2. pyth ...
- mysql存储过程之遍历多表记录后插入第三方表中
自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正 ...
- day09-文件的操作
目录 文件的基本操作 文件 什么是文件 如何使用文件 打开&关闭文件 打开&关闭文件 del f和f.close()的区别 文件路径 打开模式(不写默认是r) 编码格式 补充(open ...