Spring Boot JPA创建账户后数据库字段为Null的问题解决
问题原因及修复方案
核心问题
数据库字段为Null的本质是属性映射失败,具体有两个关键原因:
- UserDto与UserEntity的属性名称不匹配:
BeanUtils.copyProperties默认按字段名匹配,但UserDto的字段(如username、email)和UserEntity的setter/getter方法名(如setUserName、setUserEmail)不一致,导致属性无法复制。 - 日期类型不兼容: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
相关产品推荐
相关产品推荐

