Hibernate - references an unsaved transient instance

3 respostas
Chaia

Bom dia

Sou iniciante no hibernate e estou com o seguinte erro.

javax.servlet.ServletException: object references an unsaved transient instance - save the transient instance before flushing: dominio.Documento

org.vraptor.VRaptorServlet.service(VRaptorServlet.java:95)

javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Já pesquisei no forum e falaram algo de usar o session.flush(); coloquei mas não adiantou.

Tenho o seguinte relacionamento entre as tabelas:

// Esta na Classe Documento

@OneToMany(mappedBy="documento", fetch= FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Visualizacao> visualizacao;



//Esta na Classe Visualizacao
@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="cd_documento", insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Documento documento;

E os metodos que estão envolvidos são esses:

public void armazenaComentario (Comentario comentario) throws ServletException, IOException{
		
		this.daoFactory.beginTransaction();
		
		this.daoFactory.getComentarioDao().add(comentario);
		this.daoFactory.commit();
		
		this.request.getRequestDispatcher("documento.abrir.logic?documento.cdDocumento=1").forward(request, response);
              // Ate aqui funciona e envia para o metodo abaixo, quando o metodo abre é que ocorre o erro
  }


public void visualDoc(Visualizacao visual){
		this.listaVisualizacao = this.daoFactory.getVisualizacaoDao().find("documento.cdDocumento", 
				visual.getDocumento().getCdDocumento());
	}

3 Respostas

L

Cara, um objeto transiente é um objeto que o hibernate não conhece. Parece que o erro está no id do objeto que você está trabalhando. Este método anterior é para salvar, atualizar ou o que?

L

Outra… não estou conseguindo abstrair bem o que você está fazendo, mas no método “armazenaComentario” você está trabalhando com o objeto Comentario que parece ser salvo. No método debaixo você está buscando um objeto Visualizacao e parece que aí ocorre o erro falando que este objeto não está salvo no banco, portanto transiente e o hibernate não o conhece… entendeu?
Tipo, você está buscando no banco algo que não está salvo… bom parece ser isto na minha abstração.

Só uma dica… procure não controlar a transação na camada de visualização, se você for algum dia trocar a “View” de seu projeto, já era as regras de negócio… leia sobre MVC, pattern BO… coisas do gênero.

Lavieri

resumo da opera… vc esta tentando persitir um objeto, que existe outro em algum de seus parametros… e esse outro objeto não é persistente… incorrendo nesse erro…

por exemplo…

Cidade c = new Cidade();

c.setNome("Canfudoz do judas" );

c.setEstado(new Estado());

session.persist©; … aki vai incorrer em erro pois o objeto Estado que é obrigatorio para criar a cidade não existe no banco…

formas de solucionar isso, é anotar os campos com as devidas CASCADES… para fazer o trabalho de ir persintindo os objetos pendurados em cascatas…

outra coisa… se vc esta usando session.persist(objeto) saiba que ele é diferente de session.save(objeto) … o segundo consegue fazer a cascata melhor … na maioria das vezes

Observação importante: Hibernate não necessita de DAO para persitir objetos… com apenas um Repositorio generico, vc consegue dar conta de fazer isso…
vc pode criar Repositorios especificos de uma classe, apenas para montar consultas mais especificas da classe… pois o repositorio da conta de quase tudo… saves, updates, delets, findAll e findById … da pra ficar em um repositorio geral… algo assim

Repositories.save(Object entity); Repositories.remove(Object entity); Repositories.refresh(Object entity); Repositories.update(Object entity); Repositories.findAll(Class<?> entityClazz); Repositories.findById(Class<?> entityClazz, Object id);
para buscas mais especificas de cada classe, vc teria q criar Repositorio especifico da classe… para coisas com findByName… findQuantityLessThan … etc etc etc

Criado 27 de março de 2009
Ultima resposta 27 de mar. de 2009
Respostas 3
Participantes 3