SpringBoot中JPA对象与Model字段名不同映射遇父类属性为null问题
解决SpringBoot中JPA对象转Model时父类属性赋值为null的问题
1. 检查父类Setter方法的访问权限
父类的Setter方法如果是private或protected修饰,子类无法正确调用赋值。必须确保父类Setter是public权限:
// 父类BaseModel public class BaseModel { private String createUser; // 对应数据库create_user列 // 必须为public的Setter方法 public void setCreateUser(String createUser) { this.createUser = createUser; } } // 子类UserModel public class UserModel extends BaseModel { private String userName; // 对应数据库user_name列 }
2. 确认JPA实体类的数据库列映射正确
先保证从数据库能取出有效数据,JPA实体类要明确映射数据库列名:
@Entity @Table(name = "t_user") public class UserEntity { @Column(name = "create_user") // 显式指定对应数据库列 private String createUser; @Column(name = "user_name") private String userName; // 必须提供Getter方法供外部获取值 public String getCreateUser() { return createUser; } public String getUserName() { return userName; } }
如果JPA实体类映射错误,取出的父类属性本身就是null,赋值给Model自然也为空。
3. 手动赋值时必须调用父类Setter
不要直接操作父类私有字段(编译不通过或无效果),必须通过public的Setter方法赋值:
// 错误示例:直接访问父类私有字段 UserModel model = new UserModel(); model.createUser = userEntity.getCreateUser(); // 正确示例:调用父类的public Setter UserModel model = new UserModel(); model.setCreateUser(userEntity.getCreateUser()); model.setUserName(userEntity.getUserName());
4. 用映射工具自动处理(避免手动赋值出错)
手动写Setter容易遗漏或出错,推荐用MapStruct、ModelMapper这类工具自动处理父类属性映射,同时解决字段名不一致问题:
MapStruct实现示例
- 引入依赖(pom.xml):
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency>
- 定义映射接口:
@Mapper(componentModel = "spring") public interface UserMapper { // 字段名不一致时,用@Mapping指定对应关系(名字一致可省略) @Mapping(source = "createUser", target = "createUser") @Mapping(source = "userName", target = "userName") UserModel toModel(UserEntity entity); }
- 业务代码中使用:
@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private UserMapper userMapper; public UserModel getUserById(Long id) { UserEntity entity = userRepository.findById(id).orElse(null); return userMapper.toModel(entity); // 自动完成父类+子类属性映射 } }
5. 检查子类是否重复定义父类字段
如果子类重复定义了父类的字段,会覆盖父类属性,导致赋值到子类的重复字段而非父类:
// 错误示例:子类重复定义父类字段 public class UserModel extends BaseModel { private String createUser; // 重复定义,会覆盖父类的createUser private String userName; }
这种情况要删除子类中重复的父类字段,确保赋值操作作用于父类属性。
内容的提问来源于stack exchange,提问作者Sunil Yadav
相关产品推荐
相关产品推荐

