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 普通字段延迟加载无效的解决办法

时间: 2024-08-06 03:13:03

hibernate 普通字段延迟加载无效的解决办法的相关文章

C# 反射 设置字段值无效的解决办法

FieldInfo.SetValue的原型是:void SetValue(object obj, object value)当你传递一个值类型(结构是值类型)的时候,它要转化成object,也就是要装箱.而SetValue将作用在那个装箱产品上,而不是原来的那个结构. 解决办法就是自己装箱和拆箱子: object boxedB = b; //自己装箱,以便拿到装箱产品 fi.SetValue(boxedB, a); // b = (B)boxedB; //拆箱并拿到被SetValue的结果 Co

IntelliJ debug grails 无效的解决办法

从Grails 2.2以后默认run-app命令将启动Grails应用程序在一个单独的Java虚拟机. 这就是所谓的分叉的Tomcat Grails中的执行. 这样的类路径Grails构建系统和应用程序也不会干预,两个进程都有自己的内存设置. 我们可以看到在grails-app / conf / BuildConfig设置. groovy在那里我们可以找到grails.project.fork.run配置属性. 当我们想要调试程序等IDE IntelliJ IDEA我们不能使用调试命令,因为这只

[ArchLinux]进行更新时出现错误:GPGME error: 无数据,数据库无效的解决办法/

今天在我进行系统更新pacman -Syu时,出现了如下错误: # pacman -Syu 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 :: 正在同步软件包数据库... core 已经是最新版本 0.0 B 0.00B/s 00:00 [----------------------] 0% extra 已经是最新版本 0.0 B 0.00B/

ubuntu安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法

ubuntu12.04安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法 笔记本型号thinkpad E450C,前段时间删除了预装的windows,改成ubuntu12.04,并打算在ubuntu上安装一个windows虚拟机.下载vmware for linux并安装后,启动vmware提示"Cannot open /dev/vmmon: No such file or directory". 解决办法: 1.进入t

MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法

Ms - sql 数据库批量替换字符串 MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法 update ContentInfo set spcContent=replace(cast(spcContent as varchar(max)),'http://www.buy5188.com/','http://www.epowerchina.com.cn/')

Android Scrollview 内部组件android:layout_height="fill_parent"无效的解决办法

Found the solution myself in the end. The problem was not with the LinearLayout,  but with the ScrollView (seems weird, considering the fact that the ScrollView was expanding, while the LinearLayout wasn't). The solution was to use android:fillViewpo

Android layout_margin 无效的解决办法

http://www.aichengxu.com/view/31025 1.如果LinearLayout中使用Android:layout_marginRight不起作用,通过测试原来在android2.x中,如果一个控件中有android:layout_gravity属性,就会出现android:layout_marginRight没有应有的效果,而是把左边距加到右边距上去,直接去掉android:layout_gravity这个属性就能解决 2.如果是在RelativeLayout中不起作用

sqlplus中上下键无效的解决办法

环境:centos 6.0_x64 oracle版本:11g 步骤: wget http://utopia.knoware.nl/~hlub/rlwrap/rlwrap-0.30.tar.gz tar zxvf rlwrap-0.30.tar.gz cd  rlwrap-0.30 ./configure make make install vi /home/oracle/.bash_profile 最后执行: # .  ~oracle/.bash_profile 这样上下键和回退键都可以使用了.

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法

360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法     同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安装网络打印机死活安装不上,提示“数据无效”.百度了下找到了解决办法:https://jingyan.baidu.com/article/a948d6513ef4200a2ccd2e50.html 右击桌面上我的电脑→管理→服务→把device install service和device setup