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;
    }

配置完成!

原文地址:https://www.cnblogs.com/hankuikui/p/11733877.html

时间: 2024-08-03 21:02:20

Jpa/Hibernate 字节码增强:字段延迟加载的相关文章

字节码增强技术探索

1.字节码 1.1 什么是字节码? Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统.平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用.因此,也可以看出字节码对于Java生态的重要性.之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取.在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示. 图1 Java运

JVM——字节码增强技术简介

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来的字节码:在JVM加载用户的C

修改原有的方法名称(字节码增强)

通常对一个方法增加日志记录,安全检查都会说采用AOP或CGLIB动态代理,但无论哪种方式都必需改变原有的调用方式:同时,大量的反射调用也必增加系统的开销.下面介绍一种不需要改变客户端调用方式而又能实现对指定方法增加缓存或日志的方式,那就是——字节码增强! 在实际项目中通常需要对一些频繁访问数据库的方法采用对象缓存,从而提高系统性能减少不必要的网络开销.这时候一般我们会去修改方法的源码,增加Cache的put,get调用,要么采用AspectJ或cglib进行方法执行前或执行后的拦截 但采用无论采

javaAgent和Java字节码增强技术的学习与实践

参考文章: https://www.cnblogs.com/chiangchou/p/javassist.html https://blog.csdn.net/u010039929/article/details/62881743 https://www.jianshu.com/p/0f64779cdcea [本文代码下载] 下载代码 [背景] 最近在工作中进行程序的性能调优时,想起之前同事的介绍的阿里的Java在线诊断工具 —— arthas,决定试用一下. 这玩意,是真的好用,能在对被检测程

JVM字节码增强

JVM——字节码增强技术简介 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来

字节码增强

之前看了美团技术团队推送的一篇文章,介绍了字节码增强技术,可的很好,自己也记录一下,增强一下记忆,也方便日后巩固学习,有兴趣的可以去搜索美团技术团队的原文 字节码是JVM的底层基础知识,如果能够掌握对于排查问题会有更深层次的理解 1.什么是字节码 首先我们看看什么是字节码,找到一个.class文件,看看长什么样子 Java之所以可以一次编译,到处运行,首先是因为JVM针对各种操作系统和平台都进行了定制,二是无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.cl

Javassist字节码增强示例

概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方法的目的是获取一个类加载器(ClassLoader),以加载指定的.jar或.class文件,在之后的代码中会使用到. [java] view plaincopy private static ClassLoader getLocaleClassLoader() throws Exception {

逆水行舟 —— jdk动态代理和Cglib字节码增强

JDK动态代理 利用拦截器加上反射机制生成一个实现代理接口的匿名类,在调用具体方法时,调用InvocationHandler来处理 JDK动态代理只需要JDK环境就可以进行代理,流程为: 实现InvocationHandler 使用Proxy.newProxyInstance产生代理对象 被代理的对象必须实现接口 具体列子如下: public class UserServiceImpl implements UserService { @Override public void eat() {

关于java字节码框架ASM的学习

一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类.asm字节码增强技术主要是用来反射的时候提升性能的,