明天把一个业务我的项目上传到了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,说是因为一个蛋疼的反复率指标导致的主键策略改变,还不晓得会不会被回绝掉。。。

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