mysql hibernate 延迟_hibernate普通字段延迟加载无效的解决办法

关联对象的延迟加载就不说了,大家都知道。 关于普通字段的延迟加载,尤其是lob字段,若没有延迟加载,对性能影响极大。然而简单的使用 @Basic(fetch = FetchType.LAZY) 注解并没有效果。hibernate对此的解释是Lazy property loading requires buildtime byt

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

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

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值