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

ManyToMany

estou com um probleminha ao fazer um relacionamento ManyToMay, o JPA cria a tabela de relacionamento Empresa_Cliente mas não grava, um detalhe é ele não lança nenhum erro e grava os dados tanto em Empresa como em Cliente.

Eu acho que devo estar deixando passar algum detalhe. abaixo segue um exemplo do meu código.

@Entity
public Empresa {

    @ManyToMany
    private Collection<Cliente> clientes; 
}


@Entity
public class Cliente {

    @ManyToMany(mappedBy="clientes",fetch=FetchType.LAZY)
    private Collection<Empresa> empresas; 

    public String cadastrar(HttpServletRequest req, HttpServletResponse resp) {
        try {
            empresas = new ArrayList<Empresa>();
            nome = req.getParameter("nome");
            email = req.getParameter("email");
            fone = req.getParameter("fone");
            Empresa empresa = (Empresa) req.getSession().getAttribute("empresa_logada");
            Empresa empresaFound = new EmpresaDAO().findByEmailAndSenha(empresa); //retorna uma empresa gerenciável pelo JPA 

            empresaFound.addCliente(this);
            System.out.println(empresaFound); // tá imprimindo corretamente

            addEmpresa(empresaFound);
            new ClienteDAO().salvar(this);

            Carro carro = new Carro();
            carro.setAnoFab(Integer.parseInt(req.getParameter("anoFab")));
            carro.setModelo(req.getParameter("modelo"));
            carro.setPlaca(req.getParameter("placa"));
            carro.setProprietario(this);
            new CarroDAO().salvar(carro);

            carros = new ArrayList<Carro>();
            carros.add(carro);
    }
}
2 respostas

Oi Ramires, tudo certo?

Eu não sou especialista em hibernate, mas normalmente quando trabalhamos com esse tipo de relacionamento many-to-many usamos o cascade persist. Assim, a ordem de quem deve ser persistido primeiro é gerenciada pra gente. Tenta algo do tipo:

    @ManyToMany(mappedBy="clientes",fetch=FetchType.LAZY, cascade = CascadeType.ALL)
solução!

Olá Andre,eu fiz o que você recomendou, mas o problema mudou, lançava uma exception dizendo que a entidade era detached, então melhorei meu método e deu certo, ficou assim.

public class ClienteDAO extends DAO<Cliente> {

    public ClienteDAO() {
    }

    public boolean salvar(Cliente cli, HttpServletRequest req) throws Exception {
        Empresa empresa = (Empresa) req.getSession().getAttribute("empresa_logada");
        EntityManager managerFactory = JPAUtil.getEntityManagerFactory();
        managerFactory.getTransaction().begin();
        Empresa empresaManeged = managerFactory.getReference(Empresa.class, empresa.getId());
        cli.addEmpresa(empresaManeged);
        empresaManeged.addCliente(cli);    
        managerFactory.persist(cli);
        managerFactory.getTransaction().commit();
        managerFactory.close();

        return true;
    }

}

Na classe cliente ficou muito mais simples


public Cliente{
    public String cadastrar(HttpServletRequest req, HttpServletResponse resp) throws Exception {

            ValidatorUTIL.validPost(req);        
            nome = req.getParameter("nome");
            email = req.getParameter("email");
            fone = req.getParameter("fone");
            new ClienteDAO().salvar(this,req);        
            Carro carro = new Carro().cadastrar(req, this);
            addCarro(carro);
            req.setAttribute("success", "cliente cadastrado com successo");

        return loadView("fim.jsp");
    }

}