Hibernate用户与地址一对多关联后address表users_id为空如何解决
问题原因
你配置的是双向关联,mappedBy = "userEntity" 代表由Address实体的userEntity字段负责外键关联的维护,JPA只会根据该字段的值写入外键users_id。
你当前仅给AdresseDto设置了userDto,但ModelMapper默认不会自动把AdresseDto.userDto映射为AdressesEntity.userEntity,最终插入数据库时Address实体的userEntity属性为空,导致外键字段为null。
解决方案
修改Service层的CreateUser方法,在保存UserEntity前,手动给每个Address实体绑定关联的用户对象即可:
@Override public UserDto CreateUser(UserDto userDto) { UserEntity checkExisting_User = userRepository.findByEmail(userDto.getEmail()); if (checkExisting_User != null) throw new RuntimeException("user already exist !"); for (int i = 0; i < userDto.getAdresses().size(); i++) { AdresseDto address = userDto.getAdresses().get(i); address.setUserDto(userDto); address.setAdesseId(util.generatedValue(30)); userDto.getAdresses().set(i, address); } userDto.getContact().setUser(userDto); userDto.getContact().setContactId(util.generatedValue(30)); ModelMapper modelMapper = new ModelMapper(); UserEntity userEntity = modelMapper.map(userDto, UserEntity.class); userEntity.setEcryptyPassword(bCryptPasswordEncoder.encode(userDto.getPassword())); userEntity.setUserId(util.generatedValue(32)); // ========== 新增以下代码 ========== if(userEntity.getAdresses() != null && !userEntity.getAdresses().isEmpty()){ for(AdressesEntity addr : userEntity.getAdresses()){ addr.setUserEntity(userEntity); } } // ========== 新增代码结束 ========== UserEntity newUser = userRepository.save(userEntity); UserDto userDto1 = modelMapper.map(newUser, UserDto.class); return userDto1; }
其他可选方案
如果你不想手动设置,也可以配置ModelMapper的自定义映射规则,让它自动把AdresseDto.userDto映射为AdressesEntity.userEntity,但手动设置关联关系的方式更直观,也更容易排查问题。
内容的提问来源于stack exchange,提问作者Iliass20
相关产品推荐
相关产品推荐

