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
estou passando pelo mesmo problema, como vc fez para resolver?
Obrigada.
G
Giulliano
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
Karlen
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
Giulliano
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
Veneno
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 …
Existem diferents maneiras de se fazer isso…você decide a melhor…
Integercod=session.save(voCompra); //ISSO NÃO SERVE PARA NADA JÁ QUE O MÉTODO SAVE RETORNA NULLfor(VOItemvoi: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
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 …
Coloque o código da suas classes Produto e Compra, que te mostrarei como mapear a classe adequadamente.
J
jgbt
assim tmb funciona:
Giulliano:
Existem diferents maneiras de se fazer isso…você decide a melhor…
Integercod=session.save(voCompra); //ISSO NÃO SERVE PARA NADA JÁ QUE O MÉTODO SAVE RETORNA NULLfor(VOItemvoi: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
Giulliano
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 …
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…
H
hugov
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")classPessoa{@IdprivateLongidPessoa;privateStringnome;@OneToMany(cascade=CascadeType.PERSISTENCE)privateCollection<Telefone>telefone;}
Desta maneira quando você for persistir uma pessoa, você poderá fazer assim.
classCadastrarPessoa{publicstaticvoidmain(String[]args){// Métodos para abrir a sessão se for somente hibernate ou// inicializar o EntityManager.Pessoap=newPessoa();// setar o valor para pessoa com o método set// Instanciar um objeto do tipo TelefoneTelefonefone=newTelefone();List<Telefone>listaTelefone=newArrayList();// atribuir valores para ele// atribuir telefone a pessoalistaTelefone.add(fone);p.setTelefone();// agora é so persistir o objetoem.persist(p);}}
Testa ai é vê se funciona.
K
Karlen
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
Veneno
foi mal, nao é que eu nao quis passar rs … eh que eu nao to com ele aqui …
mas eu vou tentar desse jeito …