今天在看代碼的時(shí)候看到了好久沒有用過的mybatis,但是是mybatisplus應(yīng)該是后面出來的新版本再姑,而后端實(shí)體類大多會(huì)結(jié)合lombok的一些注解來實(shí)現(xiàn)备恤,自動(dòng)生成get/set等方法高帖,在代碼中看到了一些新的注解缰儿,所以查閱資料之后大致清楚了它的用法。
在lombok的官方文檔中提到的大致有以下幾點(diǎn):
- 此注解會(huì)生成equals(Object other) 和 hashCode()方法棋恼。
- 它默認(rèn)使用非靜態(tài)返弹,非瞬態(tài)的屬性
- 可通過參數(shù)exclude排除一些屬性
- 可通過參數(shù)of指定僅使用哪些屬性
- 它默認(rèn)僅使用該類中定義的屬性且不調(diào)用父類的方法
- 可通過callSuper=true解決上一點(diǎn)問題。讓其生成的方法中調(diào)用父類的方法爪飘。
@TableName("chamber_project")
@Data
@EqualsAndHashCode(callSuper = true)
另:@Data相當(dāng)于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode這5個(gè)注解的合集义起。
通過官方文檔,可以得知师崎,當(dāng)使用@Data注解時(shí)默终,則有了@EqualsAndHashCode注解,那么就會(huì)在此類中存在equals(Object other) 和 hashCode()方法犁罩,且不會(huì)使用父類的屬性齐蔽,這就導(dǎo)致了可能的問題。
比如床估,有多個(gè)類有相同的部分屬性含滴,把它們定義到父類中,恰好id(數(shù)據(jù)庫主鍵)也在父類中丐巫,那么就會(huì)存在部分對(duì)象在比較時(shí)谈况,它們并不相等,卻因?yàn)閘ombok自動(dòng)生成的equals(Object other) 和 hashCode()方法判定為相等递胧,從而導(dǎo)致出錯(cuò)碑韵。
修復(fù)此問題的方法很簡(jiǎn)單:
- 使用@Getter @Setter @ToString代替@Data并且自定義equals(Object other) 和 hashCode()方法,比如有些類只需要判斷主鍵id是否相等即足矣缎脾。
- 或者使用在使用@Data時(shí)同時(shí)加上@EqualsAndHashCode(callSuper=true)注解祝闻。
版權(quán)聲明:本文大多數(shù)內(nèi)容轉(zhuǎn)自為CSDN博主「三目君」的原創(chuàng)文章,該文章遵循CC 4.0 by-sa版權(quán)協(xié)議遗菠,
原文鏈接地址