Entity实体使用@Builder的坑

        我们开发过程中为了简化代码,经常会使用一些Lombok注解,例如@Data、@Builder、@Getter、@Setter等

        最近开发过程中,获取某张表数据时,空值字段被覆盖了其他字段的值,一时找不到原因,疯狂抓头发,情况如下:

        

        发现了没有,cardId被覆盖为memberId的值了,一开始我还以为是我字段映射的有问题,查了一下实体类,我也没用@TableField注解,没问题啊

        开始查百度,看网上有没有小伙伴遇到这种情况,结果没有!我悟了,我这是遇到低级bug了!

        我开始认真审查我的代码,从实体类注解开始,我在这个实体上使用了@Data和@Builder组合注解,@Data注解不用说了,就是为了简化代码用的,少了很多的get set方法

        那么再看@Builder注解,我进入了实体类的class类,看@Builder注解对我的实体做了什么操作        

        这一切就解释的通了,这两个字段是相同的类型,而且我没有添加全参构造器,所以查数据之后在赋值时,@Builder不知道到底需要赋值给哪个字段,所以就会造成cardId赋值了memberId的值!真是巨坑啊!

        以后要么就不用@Builder注解,要么就配合@NoArgsConstructor和@AllArgsConstructor注解一起使用

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Entity 实体类 ```java import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor @SuperBuilder(toBuilder=true) public class Entity { private Long id; private Date createTime; private Date updateTime; } ``` 2. User 实体类 ```java import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor @SuperBuilder public class User extends Entity{ private String username; private String password; private Date birthDate; private String phoneNumber; } ``` 3. BaseDao 接口 ```java import java.util.List; public interface BaseDao<T extends Entity> { void save(T entity); void update(T entity); void removeById(Long id); T findById(Long id); List<T> findAll(); } ``` 4. BaseDaoImpl 实现类 ```java import java.util.ArrayList; import java.util.List; public class BaseDaoImpl<T extends Entity> implements BaseDao<T>{ private List<T> list = new ArrayList<>(); @Override public void save(T entity) { list.add(entity); } @Override public void update(T entity) { int index = -1; for(int i=0;i<list.size();i++){ if(list.get(i).getId().equals(entity.getId())){ index = i; break; } } if(index != -1){ list.set(index,entity); } } @Override public void removeById(Long id) { T entity = findById(id); if(entity != null){ list.remove(entity); } } @Override public T findById(Long id) { for(T entity : list){ if(entity.getId().equals(id)){ return entity; } } return null; } @Override public List<T> findAll() { return list; } } ``` 5. UserDao 接口 ```java import java.util.List; public interface UserDao extends BaseDao<User> { User findUserByUsername(String username); List<User> findAllOrderByBirthDesc(); } ``` ```java import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{ @Override public User findUserByUsername(String username) { for(User user : findAll()){ if(user.getUsername().equals(username)){ return user; } } return null; } @Override public List<User> findAllOrderByBirthDesc() { return findAll().stream() .sorted(Comparator.comparing(User::getBirthDate).reversed()) .collect(Collectors.toList()); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值