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 普通字段延迟加载无效的解决办法,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。