【问题标题】:Hibernate One to Many Annotation between user Entity and Address Entity, in the Address table I don't have the association with user id休眠用户实体和地址实体之间的一对多注释,在地址表中我没有与用户ID的关联
【发布时间】:2021-09-28 11:19:10
【问题描述】:

我创建了具有地址列表的用户实体(用户实体中的@OneToMany 注释)和(地址实体中的@ManyToOne 注释)

用户和地址创建良好,但我没有通过数据库中的用户 ID 获得关联。

在地址表中,我有一列 users_id null

这是我失眠的请求:

用户实体:

@OneToMany(mappedBy = "userEntity" , cascade=CascadeType.ALL)
private List<AdressesEntity> adresses ;

地址实体

@ManyToOne
@JoinColumn(name = "users_id")
private UserEntity userEntity;

我的控制器:

@PostMapping(
        consumes = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE},
        produces = {MediaType.APPLICATION_XML_VALUE,MediaType.APPLICATION_JSON_VALUE}
        )
public ResponseEntity<UserResponse> CreatUser(@RequestBody UserRequest userRequest) 
        throws Exception {
            if(userRequest.getFirstName().isEmpty()) {
                throw new UserException(ErrorMessages.MISSING_REQUIRED_FIELD.getErrorMessage());
            }
            
            //UserDto userDto = new UserDto();
            //BeanUtils.copyProperties(userRequest, userDto);
            ModelMapper modelMapper = new ModelMapper();
            UserDto userDto = modelMapper.map(userRequest, UserDto.class);
            
            UserDto createUser = userService.CreateUser(userDto);
            
            UserResponse userResponse = modelMapper.map(createUser, UserResponse.class);
    
            return   new ResponseEntity<UserResponse>(userResponse,HttpStatus.CREATED);
}

CreateUser(UserDto userDto)的服务实现:

@Override
public UserDto CreateUser(UserDto userDto) {
    // check exiting user
    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));

    UserEntity newUser = userRepository.save(userEntity);

    UserDto userDto1 = modelMapper.map(newUser, UserDto.class);
    return userDto1;

}

我该怎么做?

【问题讨论】:

  • 你必须在地址上设置用户
  • @SimonMartinelli 是的,我做到了( address.setUserDto(userDto); )在服务实现中我在用户发送的地址列表上循环,我尝试为每个地址对象分配用户
  • 在调用 save 之前检查 UserEntity 及其关联的 AddressEntites 是否都设置了正确的关系
  • 是的,谢谢,问题出在模型映射器中,因为我在请求中命名了地址,并且在 AdresseDto 中我有地址。
  • 太棒了。请将此评论添加为答案。它可能对其他人有帮助

标签: spring spring-boot hibernate spring-data-jpa


【解决方案1】:

尝试替换

@JoinColumn(name = "users_id") @JoinColumn(name="users_id", referencedColumnName="id 或 user_id 取决于您可以使用哪些列")

问题是你错误地在实体上创建关系。

或者使用 JoinColumn(name = "user_id")

我认为是有帮助的。

【讨论】:

    猜你喜欢
    • 2015-12-15
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多