You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA创建账户后数据库字段为Null的问题解决

问题原因及修复方案

核心问题

数据库字段为Null的本质是属性映射失败,具体有两个关键原因:

  1. UserDto与UserEntity的属性名称不匹配:BeanUtils.copyProperties默认按字段名匹配,但UserDto的字段(如username、email)和UserEntity的setter/getter方法名(如setUserName、setUserEmail)不一致,导致属性无法复制。
  2. 日期类型不兼容:UserDto使用java.util.Date,UserEntity使用java.sql.Date,直接复制会触发类型转换失败,导致dob字段为空。

修复方案

方案一:统一属性与方法命名(推荐)

修改UserEntity的getter/setter方法名,与UserDto的字段名保持一致,同时保留数据库列的映射:

@Entity
@Table(name = "user", schema = "ktpm")
public class UserEntity {
    private Integer id;
    private String username;
    private String email;
    private String password;
    private String sex;
    private Date dob;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Basic
    @Column(name = "user_name")
    public String getUsername() { // 原方法名getUserName改为getUsername
        return username;
    }

    public void setUsername(String username) { // 原方法名setUserName改为setUsername
        this.username = username;
    }

    @Basic
    @Column(name = "user_email")
    public String getEmail() { // 原方法名getUserEmail改为getEmail
        return email;
    }

    public void setEmail(String email) { // 原方法名setUserEmail改为setEmail
        this.email = email;
    }

    // 其余字段(password、sex、dob)同理修改getter/setter方法名,保持与UserDto字段一致
    @Basic
    @Column(name = "user_password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Basic
    @Column(name = "user_sex")
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Basic
    @Column(name = "user_date")
    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    // equals和hashCode方法保持不变
}

修改后BeanUtils.copyProperties(userDto, userEntity)就能自动完成属性复制,同时处理日期类型时,需要保证UserDto的dob字段传入的是有效日期值。

方案二:手动属性映射(适合快速修复)

如果不想修改实体类,可以在UserService的save方法中手动赋值,同时处理日期类型转换:

@Service
public class UserService {
    @Autowired
    UserRepository userRepository;

    public String save(UserDto userDto) {
        UserEntity userEntity = new UserEntity();
        // 手动映射属性
        userEntity.setUserName(userDto.getUsername());
        userEntity.setUserEmail(userDto.getEmail());
        userEntity.setUserPassword(userDto.getPassword());
        userEntity.setUserSex(userDto.getSex());
        // 处理util.Date转sql.Date
        if (userDto.getDob() != null) {
            userEntity.setUserDate(new java.sql.Date(userDto.getDob().getTime()));
        }
        userRepository.save(userEntity);
        return "创建成功 ";
    }

    // 其余方法保持不变
}

额外检查点

确保前端表单的name属性与UserDto的字段名完全一致,比如:

<!-- signup.jsp中的表单示例 -->
<input type="text" name="username" placeholder="用户名"/>
<input type="email" name="email" placeholder="邮箱"/>
<input type="password" name="password" placeholder="密码"/>
<!-- 其余字段同理 -->

内容的提问来源于stack exchange,提问作者100 Pro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:40:38