Problemas com anotações/relacionamento no hibernate[Resolvido]

4 respostas
alexfe
Pessoal tenho a seguinte classe, Que é uma classe de categorias de despesas financeiras. Ela tem um auto relacionamento. Onde uma categoria pai tem muitos filhos e um filho tambem pode ser pai de muito filhos. Ao cadastrar um usuário é cadastrado uma lista de categorias padrão para ele. Esse é o código da lista padrão
Categoria despesas = new Categoria(null, usuario, "DESPESAS", -1);
		despesas = this.saveRetorno(despesas);
		
		this.save(new Categoria(despesas, usuario, "Moradia", -1));
		this.save(new Categoria(despesas, usuario, "Alimentação", -1));
		this.save(new Categoria(despesas, usuario, "Vestuário", -1));
		this.save(new Categoria(despesas, usuario, "Deslocamento", -1));
		this.save(new Categoria(despesas, usuario, "Cuidados Pessoais", -1));
		this.save(new Categoria(despesas, usuario, "Educação", -1));
		this.save(new Categoria(despesas, usuario, "Saúde", -1));
		this.save(new Categoria(despesas, usuario, "Lazer", -1));
		this.save(new Categoria(despesas, usuario, "Despesas Financeiras", -1));
		
		Categoria receitas = new Categoria(null, usuario, "RECEITAS", 1); 
		receitas = this.saveRetorno(receitas);  // o errro é gerado aqui
		
		this.save(new Categoria(receitas, usuario, "Salário", 1));
		this.save(new Categoria(receitas, usuario, "Restituição", 1));
		this.save(new Categoria(receitas, usuario, "Rendimento", 1));
Aqui está o problema, no auto relacionamento se eu anoto com @ManyToOne(cascade=CascadeType.PERSIST) exclui a categoria selecionada mas não cadastra o usuário com a lista padrão. Se eu anoto com @ManyToOne(cascade=CascadeType.ALL) realiza o cadastro do usuário com a lista de categorias padrão mas ao excluir, deleta todos os filhos e todos os pais da categoria selecionada. Esse é o erro quando vai gravar o usuário e está anotado com @ManyToOne(cascade=CascadeType.PERSIST) ou @ManyToOne
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.projectjsfprimefaces.entidades.Categoria
Aqui está a classe .

@Entity
public class Categoria implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Long id;

	//@ManyToOne(cascade=CascadeType.PERSIST)  // problema
	@ManyToOne(cascade=CascadeType.ALL) ///problema
	@JoinColumn(name = "categoria_pai", nullable = true)
	@ForeignKey(name = "fk_categoria_categoria")
	private Categoria pai;   // esse é o auto relacionamento

	@ManyToOne
	@JoinColumn(name = "usuario")
	@OnDelete(action = OnDeleteAction.CASCADE)
	@ForeignKey(name = "fk_categoria_usuario")
	private Usuario usuario;

	private String descricao;

	private int fator;

	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
	@JoinColumn(name = "categoria_pai", updatable = false)
	@OrderBy(value = "descricao asc")
	private List<Categoria> filhos;

	public Categoria() {
	}

	public Categoria(Categoria pai, Usuario usuario, String descricao, int fator) {
		this.pai = pai;
		this.usuario = usuario;
		this.descricao = descricao;
		this.fator = fator;
	}

	public Categoria getPai() {
		return pai;
	}

	public void setPai(Categoria pai) {
		this.pai = pai;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getFator() {
		return fator;
	}

	public void setFator(int fator) {
		this.fator = fator;
	}

	public List<Categoria> getFilhos() {
		return filhos;
	}

	public void setFilhos(List<Categoria> filhos) {
		this.filhos = filhos;
	}
	
	
   
	public void setId(Long id) {
		this.id = id;
	}

	public Long getId() {
		return id;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Categoria other = (Categoria) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}

4 Respostas

alexfe

Alguem me ajude ?

F

já tentou fazer assim?

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

[]´s

alexfe

também tentei usar as anotações desta forma mas o erro continua

alexfe

E essa execeção, como resolver ao excluir um objeto?

Criado 25 de agosto de 2011
Ultima resposta 31 de ago. de 2011
Respostas 4
Participantes 2