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

14 respostas
V

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:

14 Respostas

V

ninguem passou por isso antes ?

K

Olá,

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

Obrigada.

G

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

K

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

G

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…

V

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);
}
G

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.

V

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)

H

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

J

assim tmb funciona:

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.

[]'s

G

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)

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:

H

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.

K

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.

V

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

Criado 23 de agosto de 2007
Ultima resposta 16 de out. de 2007
Respostas 14
Participantes 5