lombok 的奇怪行为

问题描述 投票:0回答:1

我有基于 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 。但当我跳到下一行时,它仍然是真的。

有趣的是,对于某些记录,它设置正确的值,但对于某些记录,它保留活动字段的原始值。知道为什么会这样吗?

java spring spring-boot lombok
1个回答
0
投票

我正在做一个假设,因为我不知道

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 引擎对实体实例的错误解释,从而导致错误属性管理。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.