Spring Boot接口返回TblDepartments关联字段为null问题咨询
问题根因
- 你的
TblEmployees实体仅存储了外键dbID的数值,没有配置和TblDepartments的关联关系,JPA执行findAll查询时不会自动查询关联的部门数据,返回的员工实体中根本没有部门相关的属性,ModelMapper自然无法映射出dep_name的值 - 两个实体类都缺少必要的JPA注解、Get/Set方法,且当前的ModelMapper没有配置跨实体的映射规则
- 代码中存在多处拼写错误(如Service类名、Repository注入名),也可能影响运行逻辑
解决步骤
1. 修正实体类配置,添加关联关系
首先给TblDepartments添加主键注解,同时在TblEmployees中配置多对一关联,替代原来单独的dbID字段:
// TblDepartments 实体 @Entity public class TblDepartments { @Id private Integer dbID; private String dep_name; // 补全所有属性的Getter、Setter方法 }
// TblEmployees 实体 @Entity public class TblEmployees { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int emp_id; private String empName; private Boolean empActive; // 配置和部门表的关联关系 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dbID") // 和数据库中外键字段名保持一致 private TblDepartments department; // 补全所有属性的Getter、Setter方法 }
Employees_DTO保持原有结构即可,同样需要补全所有属性的Getter、Setter方法。
2. 配置ModelMapper的跨实体映射规则
将ModelMapper的全局配置放到Bean初始化的位置,避免每次转换重复设置,同时添加映射规则,将关联部门的dep_name映射到DTO的对应字段:
// 放到项目的配置类中,不要写在Service里 @Bean public ModelMapper modelMapper() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE); // 配置员工实体转DTO的映射规则 modelMapper.typeMap(TblEmployees.class, Employees_DTO.class) .addMapping(src -> src.getDepartment().getDep_name(), Employees_DTO::setDep_name); return modelMapper; }
3. 调整Repository查询逻辑,避免懒加载异常
默认@ManyToOne使用懒加载策略,查询员工时不会主动加载部门数据,需要通过EntityGraph指定关联加载:
public interface EmployeesRepository extends JpaRepository<TblEmployees, Integer> { @EntityGraph(attributePaths = "department") @Override List<TblEmployees> findAll(); }
4. 修正Service层拼写错误
Service类名EmployessServise修正为EmployeesService,注入的Repository类名修正为正确的EmployeesRepository,删除重复的转换方法命名(现有代码中两个方法都叫convertEntityToDto,会编译报错),调整后的Service代码示例:
@Service public class EmployeesService { @Autowired private EmployeesRepository repo; @Autowired private ModelMapper modelMapper; public List<Employees_DTO> getAll_Emp(){ return repo.findAll() .stream() .map(this::convertEntityToDto) .collect(Collectors.toList()); } private Employees_DTO convertEntityToDto(TblEmployees tblEmployees){ return modelMapper.map(tblEmployees, Employees_DTO.class); } // 转换DTO到实体的方法改名避免冲突 private TblEmployees convertDtoToEntity(Employees_DTO employees_dto){ return modelMapper.map(employees_dto, TblEmployees.class); } }
内容的提问来源于stack exchange,提问作者robot
相关产品推荐
相关产品推荐

