内容简介:生成getter和setter块@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
@Getter & @Setter
生成getter和setter块
@Data注解
@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
修复此问题的方法很简单:
- 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
- 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解
ToString注解
把所有属性都写到字符里返回
@EqualsAndHashCode注解
- 此注解会生成equals(Object other) 和 hashCode()方法。
- 它默认使用非静态,非瞬态的属性
- 可通过参数exclude排除一些属性
- 可通过参数of指定仅使用哪些属性
- 它默认仅使用该类中定义的属性且不调用父类的方法
- 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。
@Entity
[@Entity]
必须与@Id注解 结合使用
否则 No identifier specified for entity:
name 属性
(可选)实体名称。 缺省为实体类的非限定名称。
该名称用于引用查询中的实体。
该名称不能是 Java 持久性查询语言中的保留字面值。
不与@Table结合的话 表名 默认为 SnakeCaseStrategy(命名策略 )为表名
若使用 name属性 且没有与@Table结合 则表名为 name值的SnakeCaseStrategy(命名策略 )
例如:
@Entity public class UserEntity{...} 表名 user_entity @Entity(name="UE") public class UserEntity{...} 表名 ue @Entity(name="UsEntity") public class UserEntity{...} 表名 us_entity
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。