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";
}
}