不墨迹,上来直接给出答案:InitializingBean比JPA的注解(比如@Column、@Table)更先被classloader加载到JVM

    测试环境:(就是我的本机)

     InitializingBean和JPA注解谁更被classloader偏爱

    那么问题来了,为什么我会来测试这个加载顺序呢?

    昨天使用公司框架(封装springboot+mybatis)做一个项目,项目启动的时候需要进行一些操作,想到了实现InitializingBean接口,操作数据库返回结果自然想到JPA注解(实体类通过@Column、@Table注解)。但是再我调试的时候意外出现了,如下图:

    InitializingBean和JPA注解谁更被classloader偏爱

查询的结果size正确,但是每个对象都是null的。第一反应mybatis的查询结果和实体类属性没有对应上,但是我检查了一遍又一遍,确定以及肯定是对应上的。

    抱着试一试的态度再配置文件上加了:mybatis自动转换驼峰命名配置,再次启动竟然正确了。我也更加确定是查询结果和实体类属性没有对应上。mybatis自动转换驼峰命名配置如下:

    mybatis:
       configuration:
          map-underscore-to-camel-case: true

   但是注解明明写的都是对的,怎么没有对应上呢?我开始怀疑InitializingBean初始化的时候,JPA的注解还没有加载到JVM。于是直接导出俩个时刻的dump文件,结果如下:

InitializingBean实例化时dump文件,JVM没有找到Column

InitializingBean和JPA注解谁更被classloader偏爱

    项目启动后dump文件:找到column

InitializingBean和JPA注解谁更被classloader偏爱 

    至此可以确定:InitializingBean在实例化的时候,JPA的注解还没有加载到JVM。导致字段和实体类属性没有对应上,因此数据库查询结果的size正确,但是每个对象都是null。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-07
  • 2021-12-01
猜你喜欢
  • 2021-07-25
  • 2022-12-23
  • 2022-12-23
  • 2021-10-28
  • 2021-12-17
  • 2021-12-25
相关资源
相似解决方案