Problema de mapeamento

12 respostas
D
Boa tarde, estou tendo o seguinte problema:
object references an unsaved transient instance - save the transient instance before flushing

isso ocorre na hora de inserir dados através de um método abstrato:

são usadas 3 tabelas: Pessoa:
@OneToMany(fetch=FetchType.LAZY, mappedBy="pessoa")
	private List<MembroComissao> membroComissao;
        @OneToOne(fetch=FetchType.LAZY, mappedBy="pessoa")
	private Funcionario funcionario;
Funcionario:
@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="ID_PESSOA")
	private Pessoa pessoa;
MembroComissao:
@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="ID_PESSOA")

A logica é que uma pessoa é um funcionario e vice versa e um funcionario pode esrar em uma ou muitas comissões.
Eu imagino que em membroComissao eu deva ter um List e não uma unica pessoa , certo?
mas como ficaria o mapeamento? não trabalho com hibernate e estou estudando agora o assunto.

codigo onde ocorre o erro:
for (Funcionario membro : listaMembros) {
			MembroComissao membroComissao = new MembroComissao(); 
			membroComissao.setPessoa(membro.getPessoa());
			membroComissaoDAO.alterar(membroComissao);
			
		}
		membroComissaoDAO.flush();

12 Respostas

Rafael_Guerreiro

Mostre-nos o membroComissaoDAO.

D

Segue o codigo da função no DAO:

public String incluir() { MembroComissao membroComissao = new MembroComissao(); for (Funcionario membro : listaMembros) { membroComissao.setPessoa(membro.getPessoa()); membroComissao.setStMembroComissao(membro.getStMembroComissao); membroComissao.setCsAtribuicao(true); membroComissao.setDataInclusao(new Date()); membroComissaoDAO.alterar(membroComissao); } membroComissaoDAO.flush(); addMsgSucesso("Membro(s) Cadastrado(s) com Sucesso"); listaMembros = (Collection<Funcionario>) membroDAO.listaTodosMembros(); visualizarLabelPessoas = false; return mostrarTelaIncluir(); }

Rafael_Guerreiro

Posta a classe inteira. Me ajuda a te ajudar.

D

Obrigado pela força segue a classe…so lembrando é um sistema que esta sendo migrado e ta muito zuado mesmo, mas a ideia é so funcionar e mandar pra frente…

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import br.gov.mi.seam.fw.mb.AbstractCrudMB;
import br.gov.mi.sispad.dao.MembroComissaoDAO;
import br.gov.mi.sispad.dao.MembroDAO;
import br.gov.mi.sispad.dao.MembroService;
import br.gov.mi.sispad.dao.PessoaFisicaDAO;
import br.gov.mi.sispad.entidade.MembroComissao;
import br.gov.mi.sispad.entidade.corp.rhmi.Funcionario;

@Name("membroMB")
@Scope(ScopeType.CONVERSATION)
public class MembroMB extends AbstractCrudMB {
	
	private Collection<Funcionario> listaMembros = new ArrayList<Funcionario>();
	private Collection<Funcionario> listaPessoas = new ArrayList<Funcionario>();
	private Collection<Funcionario> listaMembrosExcluidos = new ArrayList<Funcionario>();
	private Set<Funcionario> listaPessoasSelecionadas = new HashSet<Funcionario>();
	private Collection<Funcionario> listaPessoaMembro = new ArrayList<Funcionario>();
	private Collection<Funcionario> listaFuncionarios = new ArrayList<Funcionario>();
	
	@In
	MembroDAO membroDAO;
	
	@In
	MembroService membroService;
	
	@In
	PessoaFisicaDAO pessoaFisicaDAO;
	
	@In
	MembroComissaoDAO membroComissaoDAO;
	
	
	private Funcionario membro = new Funcionario();
	
	private Funcionario pessoaFisica = new Funcionario();

	private String nome;
	private String siape;
	private Boolean visualizarBtn = false;
	private Boolean visualizarLabelPessoas = false;
	
	@Override
	public String urlManter() {
		return "/pages/administracao/membro/manterMembro";
	}

	@Override
	public String urlDetalhar() {
		return null;
	}

	@Override
	public String urlIncluir() {
		return "/pages/administracao/membro/incluirMembro";
	}

	@Override
	public String urlAlterar() {
		return null;
	}

	@Override
	public String mostrarTelaAlterar() {
		return urlAlterar();
	}

	@Override
	public String mostrarTelaDetalhar(Object entidade) {
		return urlDetalhar();
	}


	public void pesquisarPessoaFisica(){
		if(nome == "" && siape == ""){
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Pelo menos um campo deve ser preenchido para efetuar a pesquisa",""));
		}else{
			pessoaFisica = new Funcionario();
			pessoaFisica.setNmFuncionario(nome);
			pessoaFisica.setNrMatriculaSiape(siape);
			listaPessoas = pessoaFisicaDAO.buscarPessoaFisica(pessoaFisica);
			visualizarLabelPessoas = true;
			nome = "";
			siape = "";
		}
		
	}
	
	public void adicionarListaPessoaMembro(){
		
		if(pessoaFisica.getNrMatriculaSiape() != null){
		 	boolean existeMembro = membroDAO.existeMembro(pessoaFisica.getPessoa().getIdPessoa());
		 	
			if(!listaPessoasSelecionadas.contains(pessoaFisica) && existeMembro == false){
				membro.setIdFuncionario(pessoaFisica.getIdFuncionario());
				listaMembros.add(pessoaFisica);
				listaPessoasSelecionadas.add(pessoaFisica);
			}else{
				addMsgError("Membro Já Incluído ou Cadastrado");
			}
		}else{
			addMsgError("É necessário que a pessoa possua matrícula no SIAPE");
		}
		membro = new Funcionario();
	}
	
	@SuppressWarnings("unchecked")
	public void removerPessoaMembro(){
			System.out.println(membro.getNmFuncionario());
			System.out.println(membro.getIdFuncionario());
			//if(((Collection<Funcionario>) membro.getPessoa().getMembroComissao()).size() == 0){
			if(membro.getPessoa().getIdPessoa()== 0){
					
			listaMembros.remove(membro);
				//listaPessoasSelecionadas.remove(membro.getPessoaFisica());
				membroDAO.excluir(membro);
			}else{
				addMsgError("O membro " + membro.getNmFuncionario() + " Não pode ser excluído pois ele está participando de uma comissão" );
			}
	}
	
	
	public Collection<Funcionario> getListaMembros() {
		return listaMembros;
	}

	public void setListaMembros(Collection<Funcionario> listaMembros) {
		this.listaMembros = listaMembros;
	}

	public Funcionario getMembro() {
		return membro;
	}

	public void setMembro(Funcionario membro) {
		this.membro = membro;
	}


	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSiape() {
		return siape;
	}

	public void setSiape(String siape) {
		this.siape = siape;
	}

	public Collection<Funcionario> getListaPessoas() {
		return listaPessoas;
	}

	public void setListaPessoas(Collection<Funcionario> listaPessoas) {
		this.listaPessoas = listaPessoas;
	}

	public Set<Funcionario> getListaPessoaMembrosAdd() {
		return listaPessoasSelecionadas;
	}

	public void setListaPessoaMembros(Set<Funcionario> listaPessoaMembrosAdd) {
		this.listaPessoasSelecionadas = listaPessoaMembrosAdd;
	}

	public Funcionario getPessoaFisica() {
		return pessoaFisica;
	}

	public void setPessoaFisica(Funcionario pessoaFisica) {
		this.pessoaFisica = pessoaFisica;
	}

	public Boolean getVisualizarBtn() {
		return visualizarBtn;
	}

	public void setVisualizarBtn(Boolean visualizarBtn) {
		this.visualizarBtn = visualizarBtn;
	}

	public Collection<Funcionario> getListaPessoaMembro() {
		return listaPessoaMembro;
	}

	public void setListaPessoaMembro(Collection<Funcionario> listaPessoaMembro) {
		this.listaPessoaMembro = listaPessoaMembro;
	}

	public Boolean getVisualizarLabelPessoas() {
		return visualizarLabelPessoas;
	}

	public void setVisualizarLabelPessoas(Boolean visualizarLabelPessoas) {
		this.visualizarLabelPessoas = visualizarLabelPessoas;
	}

	public Collection<Funcionario> getListaMembrosExcluidos() {
		return listaMembrosExcluidos;
	}

	public void setListaMembrosExcluidos(Collection<Funcionario> listaMembrosExcluidos) {
		this.listaMembrosExcluidos = listaMembrosExcluidos;
	}


	@SuppressWarnings("unchecked")
	@Override
	@Begin(join=true)
	public void filtrarPesquisa() {
		listaMembros = (Collection<Funcionario>) membroDAO.listaTodosMembros();
	}

	
	public String incluir() {	
		MembroComissao membroComissao = new MembroComissao(); 
		for (Funcionario membro : listaMembros) {
			System.out.println(membro.getNmFuncionario());
			membroComissao.setPessoa(membro.getPessoa());
			membroComissao.setStMembroComissao(null);
			membroComissao.setCsAtribuicao(null);
			membroComissao.setDataInclusao(new Date());
			membroComissaoDAO.alterar(membroComissao);
		}
		membroComissaoDAO.flush();
		addMsgSucesso("Membro(s) Cadastrado(s) com Sucesso");
		listaMembros = (Collection<Funcionario>) membroDAO.listaTodosMembros();
		visualizarLabelPessoas = false;
	return mostrarTelaIncluir();
	}


	@Override
	@Begin(join=true)
	@Create
	public String mostrarTelaIncluir() {
		listaMembros = (Collection<Funcionario>) membroDAO.listaTodosMembros();
		return urlIncluir();
	}

	@Override
	public String alterar() {
		membroService.alterar(membro);
		return null;
	}
	@Override
	public String excluir() {
		membroService.excluir(membro);
		filtrarPesquisa();
		return null;
	}
	
	
	
}
Rafael_Guerreiro

Mas foi a classe MembroComissaoDAO que eu pedi, não a MembroMB…

Eu preciso ver como ela está implementada, pois esse erro pode estar acontecendo por causa da forma como ela é implementada.

D

então…repare que em membroComissao no metodo inluir eu recebo uma lista de membros(funcionarios) e faço um for…onde passo alguns dados para membroComissao.

a classe membroComissaoDAO apenas é usada para implementar o metodo abstrato de alterar.

@Name("membroComissaoDAO")
@AutoCreate
public class MembroComissaoDAO extends AbstractCrudDAO<MembroComissao> {

	@Override
	protected Class<MembroComissao> getEntityClass() {
		return MembroComissao.class;
	}
Rafael_Guerreiro

Eu preciso saber como está o método alterar e flush.

D

são abstratos e não tenho acesso a eles…eu acho que vou escrever um metodo na mão mesmo…

Rafael_Guerreiro

Eu vou chutar então.

O problema pode ser pelo fato de você ter essa linha

MembroComissao membroComissao = new MembroComissao();

O membroComissão que você criou não é um objeto conhecido pelo hibernate. Se você quer criar um novo, você deveria usar o método SALVAR. Algo assim:

for (Funcionario membro : listaMembros) { MembroComissao membroComissao = new MembroComissao(); // UMA INSTANCIA NOVA POR VOLTA. membroComissao.setPessoa(membro.getPessoa()); membroComissao.setStMembroComissao(membro.getStMembroComissao); membroComissao.setCsAtribuicao(true); membroComissao.setDataInclusao(new Date()); membroComissaoDAO.salvar(membroComissao); } membroComissaoDAO.flush();

D

então…é exatamente nessa hora que ocorre o erro:

Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: br.gov.mi.sispad.entidade.MembroComissao.comissao -> br.gov.mi.sispad.entidade.Comissao
Rafael_Guerreiro

Ele está te falando o problema:

save the transient instance before flushing: br.gov.mi.sispad.entidade.MembroComissao.comissao -> br.gov.mi.sispad.entidade.Comissao

SALVE a br.gov.mi.sispad.entidade.Comissao ANTES de SALVAR a br.gov.mi.sispad.entidade.MembroComissao

D

cara…eu vaiclei mesmo…o problema era um mapeamento dessa classe comissao que apontava pra classe membro…como a declaração do metodo em comissao estava no meio da classe eu não vi…obrigado pela ajuda e desculpe o vacilo! valeu

Criado 10 de julho de 2015
Ultima resposta 13 de jul. de 2015
Respostas 12
Participantes 2