解决Hibernate 注解在属性上 ,多对一,一对一懒加载 当调用one那一方getId 也会查数据库的问题

来源:互联网 发布:影子网络真的很恐怖吗 编辑:程序博客网 时间:2024/05/01 15:05

使用 hibernate5.0 版本 spring boot jpa 搭建测试

首先这个问题出现的原因是把注解写在了属性上并且fetchType=lazy,写在属性上找起来方便,但是也带了一个问题,就是在getOne那一方的id的时候会查询数据库,这是我们不希望的,我们可能更想要的是在调用类似getName的方法时候查询数据库。

出现这种情况的原因是hibernate并不能找到getIdentifierMethod ,如下图

如果在产生个这个代理类的时候就知道这个getIdentifierMethod那么getId的时候就不会去查数据库,接下来看PojoEntityTuplizer的buildProxyFactory方法

Getter是一个接口 如果我们注解放到属性上会使用GetterFieldImpl的实现,结果默认返回null

所有我们只要在这里设置getIdentifierMethod就可以,在classPath面覆盖掉这个类就可以了,实现getMethod方法

这样的话getId就不会去查询数据库了

您可以放心修改 因为GetterFieldImpl是*.spi下的类 spi下的就是让扩展的

下载源码后 直接修改数据库连接 application.yml  

 运行 test包下的 HibernateApplicationTests 的save和query方法即可 然后看看sql的打印情况


下载地址 https://git.oschina.net/hxy_happy_java/spring-boot-hibernate
 
阅读全文
1 0
原创粉丝点击