Problema OnetoMany

5 respostas
J

Olá Pessoal tudo bem?
então, eu procurei pelo guj e pelo google mas não achei o pq que qdo eu faço um relacionamento onetomany/manytoone não consigo gravar no banco de dados…
olhem como está minha classes…
está é a classe que possui o onetomany

public class Pai implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name = "idpai", nullable = false)
    private Integer idpai;
    @Column(name = "nome", nullable = false)
    private String nome;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idpai")
    private Collection<Filho> filhoCollection;

está é a classe que possui o manytoone

public class Filho implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)    
    @Column(name = "idfilho", nullable = false)
    private Integer idfilho;
    @Column(name = "nome", nullable = false)
    private String nome;
    @JoinColumn(name = "idpai", referencedColumnName = "idpai")
    @ManyToOne
    private Pai idpai;

então qdo vou gravar retorna este erro:

ERROR: null value in column "idpai" violates not-null constraint
Error Code: 0
Call: INSERT INTO filho (nome, idpai) VALUES (?, ?)
        bind => [Filho0, null]
Query: InsertObjectQuery(teste1.Filho[idfilho=null])

quem puder me ajudar eu agradeço
flw
Jonathan Martinez

5 Respostas

correainfo

Na gravacao ele nao tem o idpai para persistir as informacoes nao pode ser nulo.

Da uma olhada no seu codigo quando ele gravar.

Post o codigo que grava aki e as informacoes que vc esta gravando, fica mais facil do pessoal te ajudar

Izahhbelinha

então.. ja passei por isso esses tempos atras..
aki funciona o seguinte, O pedido tem muitos produtos e um produto pode estar em muitos pedidos. A associativa se chama ItemPedido.

No Pedido
@OneToMany (mappedBy="pedido", fetch = FetchType.LAZY)
    @Cascade (CascadeType.ALL)
    private Collection<ItemPedido> itens;
No Item pedido
@ManyToOne
    private Produto produto;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Pedido pedido;
Não sei se esse é o seu problema na hora de cadastrar. mas aki tem um add ItemPedido
public void adicionarItemPedido(Produto p){
        if(p!=null){
            ItemPedido ip = new ItemPedido();
            ip.setProduto(p);
            ip.setQuantidade(Integer.parseInt(qtdade.getText()));
            ip.setValortotal(ip.getQuantidade()*ip.getProduto().getPreco());
            if(lista==null){
                lista = new ArrayList(); 
            }
            lista.add(ip);
            TabelaUI(lista); // no meu sistema o que vai ser persistido esta em uma Jtable
            calcularTotal();
            limparProduto();
        }
    }
O cadastrar é esse:
private boolean cadastrar(Pedido p, List<ItemPedido> l){
        boolean res = false;
        p.setCodcliente(cliente);
        p.setTotalpedido(Double.parseDouble(edTotalPedido.getText()));
 
        int cont = 0;
        if(p!=null){
            for(ItemPedido ip : l){
                p.AddItem(ip);                
                cont++;
            }
        }
        if(GenericDAO.getInstance().persistir(p)!=null){
             res = true;
        }
        lista = null;
        TabelaUI(lista);
        return res;
    }
Não sei se era isso que vc procurava..
Izahhbelinha

ops… esqueci de mandar o cadastrar pedido

private void cadastrarActionPerformed(java.awt.event.ActionEvent evt) { try { Pedido p = new Pedido(); if( cadastrar(p, lista)){ JOptionPane.showMessageDialog(null, "Pedido Cadastrado"); } else { JOptionPane.showMessageDialog(null, "Pedido NÃO cadastrado"); } } catch (Exception ex) { ex.printStackTrace(); } }
seguindo a linha de pensamento do meu professor, ele disse que qdo vc coloca um CascadeType.ALL qdo vc persistir o Pedido vai ser persistido todos os itens do pedido.
Pra mim esta funcionando perfeitamente aki.

J

dae correa deu certo … vlw pia…
então ficou assim
ao instanciar a classe filho tenho que setar o pai…

Pai pai = new Pai();
            pai.setNome("Jonathan");
            ArrayList<Filho> ListaFilho = new ArrayList<Filho>();
            for (Integer i = 0; i < 2; i++) {                
                Filho filho = new Filho();
                filho.setNome("Filho" + i.toString());
                filho.setIdpai(pai);
                ListaFilho.add(filho);
            }
            pai.setFilhoCollection(ListaFilho);
            try {
                manager.persist(pai);
                transacao.commit();
            } catch(Exception e) {
                System.out.println(e.getMessage());
            }

vlw
flw!!!
Jonathan Martinez

J

obrigado izabelinha…
vlw galera…
isso que é bom o pessoal se ajudando…
flws

Criado 11 de outubro de 2008
Ultima resposta 11 de out. de 2008
Respostas 5
Participantes 3