关于java:Sonar烦恼

55次阅读

共计 2411 个字符,预计需要花费 7 分钟才能阅读完成。

  明天把一个业务我的项目上传到了 SonarQube,提醒代码反复率 7.5%,默认的规范是 5%,超标了。

  原本因为只是个用作数据收集的新我的项目,应用到的表比拟少,而表的根本字段有反复,应用了 Spring-boot-data-jpa 生成的 model 对象属性便有局部反复。

  原本是个小事件,束之高阁就好,然而。。。

  尝试应用 extends 对 model 进行继承构造梳理,A extends B,尝试编译,报错:【子类 builder 不能笼罩父类】。因为在 model 上应用了 lombok 的 builder 注解,创立的 builder 办法不能笼罩。

  因为 builder 构造的便利性,在业务代码中屡次应用了相似 A.builder().aaa().bbb().build()这种写法,不忍舍弃,尝试 google 解决,失去 @SuperBuilder 注解,在最新的 lombok18 上有提供,连忙更改依赖包版本,更改注解测试,按文档阐明父类子类都应用 @SuperBuilder 标注,测试方法中尝试 B.builder(), 未能取得。应用 compile 编译,察看生成 class 文件,确实曾经存在应用了泛型并且反对继承关系的 builder 对象和 builder()办法,为什么不胜利呢?

  猜想是 lombok 插件的问题,关上 idea 的插件管理器,查看 lombok plugin 反对注解列表阐明,果然没有 @SuperBuilder,看来只反对到 1.16 的 lombok 版本。尝试双击 lombok.jar 装置插件,发现只反对 eclipse 外围 ide,想让我换开发工具?不存在的~ 算了放弃放弃。

  尝试 @Accessors 注解,加上 chain=true 之后,生成的 setter 办法会将本身返回,看起来很好用,然而子类的示例,调用了父类属性的 setter 之后,返回的对象就变成父类了,须要申明下类型转换,略麻烦。

  还是回到 @Builder 注解做文章,察看注解属性列表,发现 builder 办法名、类名、build 办法名,都是能够更改的!尝试加上 (builderMethodName = “aesbuilder”) 进行编译,通过了!察看生成的 builder 办法,未然变成了 aesbuilder(),very Good。

  然而,同时也发现了一个重大问题,builder 返回的 Builder 类,反对的属性设置,只有子类的,而继承自父类的属性并不在外面。而事实上,@SuperBuilder 正是用来解决这一问题的,然而并没有可用的 idea 插件。。。

  google 发现了一个大神给的计划,@Builder 申明在构造方法上,而构造方法参数里,把须要用到的属性一一申明一遍,尽管略轻便,不过看似可行,于是革新代码为

    @Builder(builderMethodName = "aesbuilder")
    public ActivityEventStatistic(final Long id, final String pageCode, final String eventCode, final Integer pv, final Integer uv, final Integer timeHour,final String activityCode){super(id, pageCode, eventCode, pv, uv, timeHour);
        this.activityCode = activityCode;
    }

    public static void main(String[] args) {ActivityEventStatistic.aesbuilder().id(123l).pageCode("test").build();}

it works! wow~

  OK,编译通过,进入测试阶段,test case 跑起来,而后 duang~ 又遇到问题了!提醒执行的查问 sql,属性未找到。剖析之后发现,因为 model 应用了继承,而没有显示申明 Inheritance 策略,所以 jpa 应用了默认的策略 SINGLE_TABLE,也就是父类子类专用了一张表,再加上并没有申明哪些属性属于子类,所以就报错了。

  另外,很显然,我这种状况并不能应用 SINGLE_TABLE,而应该应用 TABLE_PER_CLASS。ok,在 model 上加上 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS),再次 run test,报错如下:

nested exception is org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: com.quzeng.idss.domain.PageStatistic

  查找问题后得悉,在 model 上应用了继承关系后,就不能应用主动主键策略了,而只能用 GenerationType.TABLE 才能够。。。吐血。。。

  ok,创立表 hibernate_sequences,增加字段 sequence_name,next_val,尝试 run test,总算胜利了。。。

  然而,面临的问题还是有的,首当其冲的是,GenerationType.TABLE 被人诟病因为每次申请时的锁机制造成的性能重大影响的问题,参考:why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate,另外一个,是我要对每个表创立 ID 生成器,指定序列器名称、范畴,以及 hibernate_sequences 表中要增加好相应记录,还要将这些改变脚本整顿下来,告知 DBA,说是因为一个蛋疼的反复率指标导致的主键策略改变,还不晓得会不会被回绝掉。。。

  哎,你说我瞎折腾什么呢。????

正文完
 0