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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:12:04