导航菜单
路很长,又很短
博主信息
昵   称:Cocodroid ->关于我
Q     Q:2531075716
博文数:308
阅读量:794867
访问量:73352
至今:
×
云标签 标签球>>
云标签 - Su的技术博客
博文->>首页 博主的更多博文>>
Hiberante3实体字段延迟加载失效问题
Tags : Hiberante3,延迟加载发表时间: 2019-01-30 22:59:56
关联对象的延迟加载就不说了,大家都知道。

关于普通字段的延迟加载,尤其是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 content;  
    }  
      
    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。

PS:记得在查询的地方需要调用xx.getContent触发延迟加载,不然可能更新不到此字段!!!

可能更有用的资料:

Hibernate3属性延迟加载 https://zengguo1988.iteye.com/blog/296850

 hibernate 普通字段延迟加载无效的解决办法 https://blog.csdn.net/dys1990/article/details/38728175


打赏
打赏
关注公众号
公众号
类别:Java| 阅读(208)| 赞 (0)
上一篇 : C10K问题
评论
暂无评论!
发表评论
昵  称:

验证码:

内  容:

    同时赞一个 赞