Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Table 'renda_familiar_api.users_roles' doesn't exist

Estou implementando uma autenticação na minha API com Spring Security,

consigo cadastrar um novo usuário tudo certo porém estou tendo problemas ao dar a ROLE para esse usuário.

Quando realizo a requisição o hibernate retorna:

Hibernate: 
    select
        receita0_.id as id1_1_,
        receita0_.ano as ano2_1_,
        receita0_.data as data3_1_,
        receita0_.descricao as descrica4_1_,
        receita0_.mes as mes5_1_,
        receita0_.valor as valor6_1_ 
    from
        receitas receita0_
Hibernate: 
    select
        receita0_.id as id1_1_,
        receita0_.ano as ano2_1_,
        receita0_.data as data3_1_,
        receita0_.descricao as descrica4_1_,
        receita0_.mes as mes5_1_,
        receita0_.valor as valor6_1_ 
    from
        receitas receita0_
Hibernate: 
    select
        receita0_.id as id1_1_,
        receita0_.ano as ano2_1_,
        receita0_.data as data3_1_,
        receita0_.descricao as descrica4_1_,
        receita0_.mes as mes5_1_,
        receita0_.valor as valor6_1_ 
    from
        receitas receita0_
Hibernate: 
    select
        user0_.id as id1_3_0_,
        user0_.name as name2_3_0_,
        user0_.password as password3_3_0_,
        user0_.username as username4_3_0_ 
    from
        users user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        role0_.id as id1_2_0_,
        role0_.name as name2_2_0_ 
    from
        roles role0_ 
    where
        role0_.id=?
Hibernate: 
    delete 
    from
        users_roles 
    where
        user_id=?

Nesse final da pra ver que eles faz um "from user_roles" acredito que seja aí o problema mas não consegui identificar ainda no código o por quê.

Será problema de mapeamento?

Minha entidade User:

@Entity
@Data
@Table(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String username;
    private String password;

    @ManyToMany
    private List<Role> roles;


}

Entidade role:


@Entity
@Table(name = "roles")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;


    public Role(Long id) {
        this.id = id;
    }



}

Service atribuindo role:

@Service
public class CreateRoleUserService {

    @Autowired
    UserRepository userRepository;

    public User execute(CreateUserRoleDTO createUserRoleDTO) {

        Optional<User> userExists = userRepository.findById(createUserRoleDTO.getIdUser());
        List<Role> roles = new ArrayList<>();

        if (userExists.isEmpty()) {
            throw new Error("User does not exists!");
        }

        roles = createUserRoleDTO.getIdsRoles().stream().map(role -> {
            return new Role(role);
        }).collect(Collectors.toList());

        User user = userExists.get();

        user.setRoles(roles);

        userRepository.save(user);

        return user;
    }
}

DTO para criar role:

import lombok.Data;
import java.util.List;

@Data
public class CreateUserRoleDTO {

    private Long idUser;
    private List<Long> idsRoles;


}

createUserService:

@Service
public class CreateUserService {

    @Autowired
    UserRepository userRepository;


    private BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }


    public User execute(User user) {

        User existsUser = userRepository.findByUsername (user.getUsername());

        if(existsUser != null) {
            throw new Error("User already exists!");
        }

        user.setPassword(passwordEncoder().encode(user.getPassword()));

        User createdUser = userRepository.save(user);

        return createdUser;
}}

Repositorio com o projeto completo: https://github.com/matthewmatheus/renda-familiar-api

1 resposta
solução!

Resolvido.

Meu application.properties não estava configurado corretamente e ele não estava subindo os dados da aplicação com o JPA, fora isso faltava fazer o Join que justamente cria o users_roles.

Ficou assim:

  @ManyToMany
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List<Role> roles;

}