关联对象的延迟载入就不说了。大家都知道。

关于普通字段的延迟载入,尤其是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 普通字段延迟载入无效的解决的方法的更多相关文章

  1. hibernate之4.延迟载入

    延迟载入: 仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库 get不支持延迟载入 @Test public void getTest(){ Session session=n ...

  2. java运行shell命令,chmod 777 xxx,改变权限无效的解决的方法。

    在java程序中运行shell命令,改变文件的权限.能够在命令行中运行 chmod 777 <span style="font-family: Arial, Helvetica, sa ...

  3. 解决的方法:mysql_connect()不支持请检查mysql模块是否正确载入

    故障现象:linux 安装discuz 错误提示:mysql_connect() 不支持请检查mysql模块是否正确载入. 解决的方法:查看/usr/lib/php/modules/ (64位的看/u ...

  4. Hibernate中的session和load延迟载入矛盾问题,怎样解决?

    假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter>  <filter-n ...

  5. Hibernate 延迟载入

    一.延迟载入定义                 延迟载入,也叫懒载入,它是Hibernate为提高程序运行效率而提供的一种机制,即当仅仅有真正使用该对象的数据时才会创建. 说白了,所谓的延迟载入不是 ...

  6. hibernate手动设置的id无效的原因与解决方法

    在使用Hibernate的过程中,发现手动设置的id(主键)无效,Hibernate仍然会在保存(调用Hibernate提供的merge()方法)的时候自动生成一个随机的id. 经过调试发现问题出在了 ...

  7. 设置height:100%无效的解决方法

    设置height:100%无效的解决方法 刚接触网页排版的新手,常出现这种情况:设置table和div的高height="100%"无效,使用CSS来设置height:" ...

  8. [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系

    [转]Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系 1.如表Class(ClassID,Class_No,ClassName)与Student(S ...

  9. 原声JS瀑布流加延迟载入

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. android:autoLink

    android:autoLink 显示URL链接 TextView识别链接的方式有两种,一种是自动识别链接和HTML解析链接 1)自动识别链接 <!-- android:autoLink=&qu ...

  2. ACM算法目录

    数据结构 栈,队列,链表 •哈希表,哈希数组 •堆,优先队列 双端队列 可并堆 左偏堆 •二叉查找树 Treap 伸展树 •并查集 集合计数问题 二分图的识别 •平衡二叉树 •二叉排序树 •线段树 一 ...

  3. BZOJ 4867 分块+神tm卡常

    思路: 注意到len<=10 按照权值max-min<=sqrt(n)*len 分块 记一下前缀和  每修改sqrt(n)次以后重新分块   修改的时候整块打标记  两边重构 (这题常数卡 ...

  4. 题解报告:hdu 1527 取石子游戏(威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...

  5. jsp文件就是Servlet,可以在tomcat里进行查看

    D:\apache-tomcat-8.0.21\work\Catalina\localhost\springmvc2\org\apache\jsp\index_jsp.class

  6. 321 Create Maximum Number 拼接最大数

    已知长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,直观地表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中 ...

  7. Dancing Links X 学习笔记

    \(\\\) Definitions 双向链表:记录前后两个指针的链表,每个顺序关系都有双向的指针维护. \(Dancing\ Links\):双向十字循环链表,建立在二维关系上,每个元素记录上下左右 ...

  8. jQuery——开关灯

    js对象与jquery对象的相互转化: 1.$(js对象) 2.$(selector).get(索引).$(selector)[索引] <!DOCTYPE html> <html l ...

  9. [文章转载]-我的Java后端书架-江南白衣

    我的Java后端书架 (2016年暮春3.0版) 04月 24, 2016 | Filed under 技术 书架主要针对Java后端开发. 3.0版把一些后来买的.看的书添补进来,又或删掉或降级一些 ...

  10. (转)淘淘商城系列——初始SolrCloud

    http://blog.csdn.net/yerenyuan_pku/article/details/72944611 本文我只是简单介绍一下SolrCloud,如果大家要是感兴趣的话,可以参考Sol ...