Relacionamento many-to-many ou one-to-many?

Bom dia galera …

estou trabalhando com hibernate …
estou com um problema …

tenho uma tabela de compra e uma tabela de produto que geraria uma terceira tabela item_compra …na minha tabela item_compra tenho a chave da tabela compra “idCompra”, a chave da tabela produto “cod_produto” e alguns atributos proprios, qtd e valorTotal…
estava tentando fazer um ralcionamento many-to-many e mapeando a tabela item_compra com um composite…mas nao tava dando certo agora estou tentando fazer
com one-to-many … no relacionamento one-to-many esta dando o seguinte erro …

object references an unsaved transient instance - save the transient instance before flushing: br.com.autoeletrica.integracao.VOItem_Compra

nao sei qual devo usar …

vlw … :smiley:

ninguem passou por isso antes ?

Olá,

estou passando pelo mesmo problema, como vc fez para resolver?

Obrigada.

O seu problema é que vc esta tentando salvar uma instância, por exemplo, de compra…Sem ter salvo antes o item.

quando vc usa relacionamentos vc precisa persistir os objetos antes de salva-los.

no exemplo um usuário faz parte de um grupo…eles tem relacionamento. MAS para fazer isso funcionar vc precisaria fazer:

Criar um grupo novo (O que provavelmente é o seu caso)…


Grupo grupo = new Grupo();

grupo.setGrupoNome("Admin");

sesssao.save(grupo) //persistiu o valor
//faz um commit

Usuario ususario = new Usuario();

usuario.setNome("Alguem");
usuario.setGrupo(grupo);

sessao.save(usuario);
//faz um commit

Se eu tivesse tentado salvar o usuário sem ter salvo o grupo primeiro iria receber exatamente o mesmo erro que vc recebeu…

[/]'s

O problema que estou tento não é na hora de salvar um objeto preenchido. O meu problema é que tenho uma tabela paciente com um relacionamento com uma tabela estado. Porém este campo não é obrigatório, então quando eu não preencho a combo ele dá este erro, se eu preencher ele insere normalmente. No mapeamento já retirei o not-null.

Obrigada

Karlen vc esta usando as annotations ???

tente colocar o @nullable em cima do valor que poderá ser nulo

se mesmo assim estiver dando erro exatamente nessa hora mande o fonte da classe paciente pra gente ver…

eu fiz com one-to-many msm …
eu nao to com o exemplo aqui nao lembro direito
mas acho que deve ter um jeito mais correto …

fiz ± assim :

salvei primeiro a compra e peguei o id_Compra que foi salvo… fiz um for na propria classe de persistencia pra
adicionar cada item_compra …

Integer cod = session.save(voCompra);
 
for (VOItem voi : listaItem) {
     voi.setCodigo(cod);
     session.save(voi);
}

Existem diferents maneiras de se fazer isso…você decide a melhor…


Integer cod = session.save(voCompra);   //ISSO NÃO SERVE PARA NADA JÁ QUE O MÉTODO SAVE RETORNA NULL
  
for (VOItem voi : listaItem) {   
     voi.setCodigo(cod);   
     session.save(voi);   
} 

Quando vc salva um objeto ele simplesmente salva e fim. Não retorna nada, se vc põe Integer x = sessao.save(); O seu x é vazio.

voce esta redondamente enganado
Segundo a documentação do hibernate o metodo save retorna um serializable…
se isso tiver errado ja nao sei de mais nda …

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#save(java.lang.Object)

Coloque o código da suas classes Produto e Compra, que te mostrarei como mapear a classe adequadamente.

assim tmb funciona:

[quote=Giulliano]Existem diferents maneiras de se fazer isso…você decide a melhor…


Integer cod = session.save(voCompra);   //ISSO NÃO SERVE PARA NADA JÁ QUE O MÉTODO SAVE RETORNA NULL
  
for (VOItem voi : listaItem) {   
     voi.setCodigo(voCompra.getId());   
     session.save(voi);   
} 

Quando vc salva um objeto ele simplesmente salva e fim. Não retorna nada, se vc põe Integer x = sessao.save(); O seu x é vazio.[/quote]

[]'s

[quote=Veneno]voce esta redondamente enganado
Segundo a documentação do hibernate o metodo save retorna um serializable…
se isso tiver errado ja nao sei de mais nda …

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#save(java.lang.Object)[/quote]

Desculpe…é verdade ele retorna o ID gerado para o objet persistido…

no caso se vc salva uma compra ele retorna o ID a sua compra…aí a partir desse id vc pode salvar os seus items de compra… :smiley:

Para você salvar uma tabela desta maneira você pode utilizar a anotação.

Ou seja , quando você salvar um produto ele salvará automaticamente o item compra. Claro que seu mapeamento deverá estar configurado corretamente.

Já que você não quis me passar o seu código fonte, vou fazer um exemplo aqui mesmo.


// Imports da classe

@Entity
@Table("t_pessoa")
class Pessoa {

      @Id
      private Long idPessoa;

      private String nome;

      @OneToMany(cascade = CascadeType.PERSISTENCE)
      private Collection<Telefone> telefone;

}
@Entity
@Table("t_telefone")
class Telefone{

      @Id
      private Long idTelefone;

      private Long ddd;

      private Long numero;

      @OneToMany(cascade = CascadeType.PERSISTENCE)
      private Collection<Pessoa> pessoa;

}

Desta maneira quando você for persistir uma pessoa, você poderá fazer assim.


class CadastrarPessoa {

      public static void main(String [] args) {
            // Métodos para abrir a sessão se for somente hibernate ou
            // inicializar o EntityManager.
            Pessoa p = new Pessoa();
            
            // setar o valor para pessoa com o método set
            // Instanciar um objeto do tipo Telefone
            Telefone fone = new Telefone();
            List<Telefone> listaTelefone = new ArrayList();

            // atribuir valores para ele
            // atribuir telefone a pessoa
            listaTelefone.add(fone);
            p.setTelefone();

            // agora é so persistir o objeto
           em.persist(p);
      }

}

Testa ai é vê se funciona.

Olá Pessoal,

Bom eu não estou usando o annotations, mas eu consegui fazer funcionar sim, eu pego o id gerado e carrego na sessao do hibernate.

Brigaduuuuu.

foi mal, nao é que eu nao quis passar rs … eh que eu nao to com ele aqui …
mas eu vou tentar desse jeito …

vlw veio