Hibernate Annotations Many-to-One problemas ao remover[RESOLVIDO]

7 respostas
hudson.negao

Tenho uma classe Funcionario que tem um cargo
na hora de salvar e buscar ta tudo ok mais na hora de remover ele da um erro.
segue o codigo e o erro

@Entity
@AttributeOverride(name = "codigo", column = @Column(name = "idfuncionario"))
public class Funcionario extends Pessoa {
	private Float salario;

	@ManyToOne
	@JoinColumn(name = "idcargo")
	private Cargo cargo;

o erro

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.edu.udc.vo.Cargo
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)

alguem pode me dar alguma dica de como resolver?

7 Respostas

fiaux

A sua tabela Funcionario tem um FK para Cargo. Como ela aponta para lá você deve salvar o registro Cargo antes. Falando em OO, na sua classe Funcionario tem um atributo Cargo que deve ser salvo antes do objeto Funcionario.

hudson.negao

como eu faço isso?
é pela annotation mesmo?
você pode me dar um exemplo?

fiaux

Você não tem um método para realizar o save dos objetos?

hudson.negao

sim, mas o cargo ja esta salvo eu quero apagar somente o funcionario.

meu void main esta assim

ControllerFuncionario controller = new ControllerFuncionario();
controller.getFuncionario().setCodigo(new Long(1));
controller.remove();

o metodo remove na controller

public void remove() {
		facadeFuncionario.remove(this.funcionario);
	}

o facade

public void remove(T u){
		if(factory.hasTransaction())
		{
			dao.remove(u);
		}
		else
		{
			try {
				factory.beginTransaction();
				dao.remove(u);
				factory.commit();
			}catch (Exception e) {
				System.out.println(e);
				e.printStackTrace();
				factory.rollback();
			} 
		}
	}
fiaux

A mensagem de erro foi na remoção de um objeto Funcionario? Eu só havia visto ao salvar com uma referência para outro objeto o qual ainda não havia persistido.

public class TransientObjectException
extends HibernateException

Thrown when the user passes a transient instance to a Session method that expects a persistent instance.

Author:
Gavin King

Por acaso em Cargo tem alguma referência para Funcionario? Na classe?

hudson.negao

tem sim.

@Entity
public class Cargo {
	@Id
	@GeneratedValue
	@Column(name = "idcargo", nullable = false)
	private Long codigo;
	private String nome;

	@ManyToOne
	private Collection<Funcionario> listaFuncionario;
hudson.negao

resolvido usando fetch=FetchType.lazy

@Entity
@AttributeOverride(name = "codigo", column = @Column(name = "idfuncionario"))
public class Funcionario extends Pessoa {
	private Float salario;

	@ManyToOne(fetch=FetchType.LAZY)    <-----
	@JoinColumn(name = "idcargo")
	private Cargo cargo;
Criado 8 de abril de 2008
Ultima resposta 8 de abr. de 2008
Respostas 7
Participantes 2