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
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…
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.
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 …
[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]
[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 …
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);
}
}