我有基于 Spring Boot 3.2 的应用程序,我正在使用最新的可用版本的 lombok。
我有以下实体:
@Data
@Entity
public class AppUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String email;
private boolean active;
}
我还有一项维护 AppUser 的服务,在该服务中我正在计算用户是否应该处于活动状态:
@Service
public class UserService {
public AppUser processAppUser(AppUser appUser) {
...
appUser.setActive(verifyUserActivity());
//here some other staff
...
}
}
有趣的部分是“appUser.setActive(verifyUserActivity())”行。当程序进入 UserService.processAppUser 时,appUser.active 为 true。然后转到调用 setActive 方法的行。我在这一行设置了断点。我通过调试器评估方法 verifyUserActivity() ,它返回 false。所以我希望 appUser.active=false 。但当我跳到下一行时,它仍然是真的。
有趣的是,对于某些记录,它设置正确的值,但对于某些记录,它保留活动字段的原始值。知道为什么会这样吗?
我正在做一个假设,因为我不知道
appUser.setActive(verifyUserActivity())
调用周围的所有代码:它可能取决于实体上 @Data
注释的使用以及生成的方法的交互(特别是, equals
和 hashCode
) 使用 jpa 引擎。
最好不要在实体上使用
@Data
,而使用这组注释:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class AppUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@EqualsAndHashCode.Include
private Integer id;
...
}
通过这种方式,您创建的
equals
和 hashCode
方法仅依赖于标识符,而不是整个属性集,这可能会导致 jpa 引擎对实体实例的错误解释,从而导致错误属性管理。