Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

NÃO CONSIGO CRIAR NOVO USUARIO

sempre que tento criar um novo usuario pelo sistema recebo este erro

Cannot add or update a child row: a foreign key constraint fails (casadocodigo.Usuario_Role, CONSTRAINT FK_5nbp4m2sk65w2mq9rfn680cx2 FOREIGN KEY (role_nome) REFERENCES Role (nome))

so consigo criar diretamente no banco de dados, ai sim aparece na lista de usuarios.

@Repository
public class UsuarioDAO implements UserDetailsService {

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Usuario usuario) {
        manager.persist(usuario);
    }

    public List<Usuario> listar() {
        return manager.createQuery("select u from Usuario u", Usuario.class).getResultList();
    }

    public Usuario loadUserByUsername(String email) {
        List<Usuario> usuarios = manager.createQuery("select u from Usuario u where email = :email", Usuario.class)
                .setParameter("email", email).getResultList();

        if (usuarios.isEmpty()) {
            throw new UsernameNotFoundException(
                    "Usuario " + email + " não foi encontrado pelo método 'loadUserByUsername' ");
        }

        return usuarios.get(0);
    }

    public Boolean existe(String email) {

        Usuario usuarioEncontrado;

        try {
            usuarioEncontrado = manager.createQuery("select u from Usuario u where email = :email", Usuario.class)
                    .setParameter("email", email).getSingleResult();

        } catch (NoResultException e) {
            System.out.println(">> Usuario não Existe!");
            return false;
        }

        System.out.println(">>> Usuario " + usuarioEncontrado.getNome() + " já Existe.");
        return true;
    }

    public void alterar(Usuario usuario) {
        Usuario usuario2 = manager.find(Usuario.class, usuario.getId());
        usuario2.setRoles(usuario.getRoles());
    }

` @Controller @Transactional public class UsuarioController {

@Autowired
private UsuarioDAO dao;

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.addValidators(new UsuarioValidation());
}

@RequestMapping("/usuarios")
public ModelAndView listar() {
    List<Usuario> lista = dao.listar();
    ModelAndView modelAndView = new ModelAndView("usuarios/lista");
    modelAndView.addObject("usuarios", lista);
    return modelAndView;
}

@RequestMapping("/usuarios/form")
public ModelAndView form(Usuario usuario) {
    return new ModelAndView("usuarios/form");
}

@RequestMapping(value = "/usuarios", method = RequestMethod.POST)
public ModelAndView gravar(@Valid Usuario usuario, BindingResult result, RedirectAttributes rediredtAttributes) {

    if (result.hasErrors()) {
        System.out.println("ERRO NO BIND");
        return form(usuario);
    }

    if (dao.existe(usuario.getEmail())) {
        rediredtAttributes.addFlashAttribute("message", "Esse email já é Cadastrado!");
        return new ModelAndView("redirect:/usuarios/form");
    }

    List<Role> roles = new ArrayList<>();
    Role role = new Role();
    role.setNome("ROLE_USER");
    roles.add(role);
    usuario.setRoles(roles);

    dao.gravar(usuario);
    rediredtAttributes.addFlashAttribute("message", "Usuario Cadastrado com Sucesso!");
    return new ModelAndView("redirect:/usuarios");
}

@RequestMapping(value = "/usuarios/roles")
public ModelAndView roles(@RequestParam("email") String email) {
    Usuario usuario = dao.loadUserByUsername(email);
    ModelAndView modelAndView = new ModelAndView("/usuarios/roles");
    modelAndView.addObject("usuario", usuario);
    return modelAndView;
}

@RequestMapping(value = "/usuarios/roles", method = RequestMethod.POST)
public String alterar(String email, HttpServletRequest request, RedirectAttributes rediredtAttributes) {

    String[] array = request.getParameterValues("role");
    Usuario usuario = dao.loadUserByUsername(email);

    List<Role> listaRole = new ArrayList<>();
    for (int i = 0; i < array.length; i++) {
        Role role = new Role();
        role.setNome(array[i]);
        listaRole.add(role);
    }

    usuario.setRoles(listaRole);

    dao.alterar(usuario);

    rediredtAttributes.addFlashAttribute("message", "Permissões alteradas com sucesso!");
    return "redirect:/usuarios";

}

}

2 respostas

Gerson, boa tarde!

Isso ocorre pois você está tentando fazer uma atulização na tabela que possui uma chave estrangeira, ele pode estar ocorrendo porque você tem que referenciar a sua chave estrangeira a um dado que de fato exista na outra tabela, ou a tabela que recebe a chave estrangeira está vazia, então é necessário popular essa tabela.

Espero ter ajudado e bons estudos!

solução!

Entendi, mas você tem como me explicar como faço isso? meu grande problema e esse, qual sua sugestão para resolver este problema. tem como me dar um exemplo de como posso fazer?