hibernate普通字段懒加载及实现PersistentAttributeInterceptor后产生的集合关联无法保存的解决方法,及hibernate字节增强插件的使用

首先请查看https://blog.csdn.net/windsigirl123/article/details/60957632,通过模仿这篇文章确实可以产生效果,但是出现ManyToMany的集合关联时,即存在集合关联懒加载时,不能单纯的模仿博文提到的普通字段的修改方式。

 

该情况下会产生两个问题:

        1.多对多懒加载关联无法保存数据,其他集合懒加载关联类似

        2.如果编写代码失误会导致懒加载的字段无法序列化,即便使用了Hibernate5Module(该情况在使用hibernate字节增强插件时尤其明显,下面讲)。

 

解决方法:

使用hibernate-enhance-maven-plugin字节增强插件,该插件会在编译时会修改实体到目标值,可以查看反序列化后的效果。

 

使用方法:

maven:

 <plugin>
        <groupId>org.hibernate.orm.tooling</groupId>
        <artifactId>hibernate-enhance-maven-plugin</artifactId>
        <version>4.3.5.Final</version>
        <configuration>
               <failOnError>true</failOnError>
               <enableLazyInitialization>true</enableLazyInitialization>//必须要
               <enableDirtyTracking>true</enableDirtyTracking>
               <enableAssociationManagement>true</enableAssociationManagement>//存在懒加载集合关联需要加上这个配置
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>enhance</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

     然后运行

mvn install -Dmaven.test.skip=true

可反编译编译的class文件进行查看确认。

 

问题:

     使用字节增强会导致序列化问题,如果有更好的方法可以分享下。

     我几番尝试,无奈,只能将反汇编的替换掉原来的类,再在需要懒加载字段的get方法中加上了判断session是否有效的语句,如下:

   (注:this.$$_hibernate_getInterceptor())是使用字节增强会在class文件中加上去的)

if (this.$$_hibernate_getInterceptor() instanceof LazyAttributeLoadingInterceptor
  &&
  (
    ((LazyAttributeLoadingInterceptor) this.$$_hibernate_getInterceptor()).getLinkedSession() == null)
  || ((LazyAttributeLoadingInterceptor) this.$$_hibernate_getInterceptor()).getLinkedSession().isClosed()
) {
  return this.filed;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值