Jpa/Hibernate 字节码增强:字段延迟加载
Posted 二奎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jpa/Hibernate 字节码增强:字段延迟加载相关的知识,希望对你有一定的参考价值。
JPA提供了@Basic注解,实现延迟加载字段的功能,如下:
@Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT" ) private String remarkContent;
但是实际上延迟加是不是起作用的,依然能够出这个字段的数据。
为了延迟加载生效,需要使用字节码增加的插件:
在pom文件中配置:
<plugin> <groupId>org.hibernate.orm.tooling</groupId> <artifactId>hibernate-enhance-maven-plugin</artifactId> <version>5.4.3.Final</version> <executions> <execution> <configuration> <failOnError>true</failOnError> <enableLazyInitialization>true</enableLazyInitialization> </configuration> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin>
compile一下项目之后 ,再运行项目,即可看到效果。JPA只查询了我们需要的特定字段。
但这个有一个缺点,就是需要编译代码,
如果我们不想编译代码,仍然使用字节码增加的话,需要手工代码增加的代码:
@Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT" ) private String remarkContent; public String getRemarkContent() { if (interceptor!=null) { return (String) interceptor.readObject(this, "remarkContent", billView); } return remarkContent; } public void setRemarkContent(String remarkContent) { if (interceptor!=null) { this.remarkContent = (String) interceptor.writeObject(this,"owner", this.billView,billView); return ; } this.remarkContent = remarkContent; } @Transient private PersistentAttributeInterceptor interceptor; @Override public PersistentAttributeInterceptor $$_hibernate_getInterceptor() { return interceptor; } @Override public void $$_hibernate_setInterceptor(PersistentAttributeInterceptor interceptor) { this.interceptor = interceptor; }
配置完成!
以上是关于Jpa/Hibernate 字节码增强:字段延迟加载的主要内容,如果未能解决你的问题,请参考以下文章
使用 FetchType.LAZY 防止 JPA/Hibernate 中的延迟加载(尤其是在使用 @Transactional 时)?