Jboos Seam - erro org.hibernate.NonUniqueObjectException: a different object with the same iden

0 respostas
R

Pessoal

[color=red]erro org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[/color]

Estou tentando caminhar no estudo do Java, mas estou meio agarrado com esse erro ai. Até consegui resolver removendo o merger e repesquisando o objeto antes de exclui-lo (descomenntando as linhas no delete da Action), mas essas são soluções gambiarra, alguem sabe uma solução de verdade para resolver isso?

Classe DAO generica

package br.dao;

import org.hibernate.Session;
import org.jboss.seam.annotations.In;

public class Generico {

	@In
	private Session sessao;

	public void excluir(Object obj) {
		try {
			sessao.delete(obj);
			sessao.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void alterar(Object obj) {
		try {		
		sessao.merge(obj);
		sessao.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

A Action

package br.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

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

import br.bel.Categoria;
import br.dao.CategoriaDAO;

@Scope(ScopeType.CONVERSATION)
@Name("categoriaAction")
public class CategoriaAction implements Serializable {

	static final long serialVersionUID = 1L;

	@In
	private CategoriaDAO categoriaDAO;
	// Variaveis da tela de categoria.
	private Categoria categoria;
	// Variavel da tela de listagem
	private List<Categoria> categorias;

	public CategoriaAction() {

	}

	@End
	public String Salvar() {
		if(categoria.getSequencialCategoria() == 0)
		{
			categoriaDAO.salvar(categoria);
		}
		else 
		{
			categoriaDAO.alterar(categoria);
		}
		return "SUCCESS";
	}

	@End
	public String Excluir() {
		categorias = categoriaDAO.consultar(categoria.getSequencialCategoria());
		categoria = categorias.get(0);
		categoriaDAO.excluir(categoria);
		categoria = new Categoria();
		return "SUCCESS";
	}

	public List<Categoria> CarregaCategoriasGrid() {
		Categoria categoriaSearch = new Categoria();
		return categoriaDAO.pesquisar(categoriaSearch);
	}
	
    @Begin(flushMode = FlushModeType.MANUAL, join = true)
	public String CarregaCategoriaEditavel(int sequencialCategoria) {
		categorias = categoriaDAO.consultar(sequencialCategoria);
		categoria = categorias.get(0);

		return null;
	}

	//GETS E SETS
}

A tela

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
<body>
<f:view>

	<a4j:form>
		<a4j:region>
			<dl>
				<dt><h:outputText value="Código Sequencial:" /></dt>
				<dd><h:inputText id="seqcat"
					value="#{categoriaAction.categoria.sequencialCategoria}" size="60" /></dd>
			</dl>
			<dl>
				<dt><h:outputText value="Nome da Categoria:" /></dt>
				<dd><h:inputText id="nomecat"
					value="#{categoriaAction.categoria.nomeCategoria}" size="60" /></dd>
			</dl>
			<dl>
				<dt><h:outputText value="Descrição:" /></dt>
				<dd><h:inputTextarea id="desccat"
					value="#{categoriaAction.categoria.descricaoCategoria}" /></dd>
			</dl>
			<br />
			<h:commandLink action="#{categoriaAction.Novo}">
				<button><span> Novo </span></button>
			</h:commandLink>
			<h:commandLink action="#{categoriaAction.Salvar}">
				<button><span> Salvar </span></button>
			</h:commandLink>
			<h:commandLink action="#{categoriaAction.Excluir}">
				<button><span> Excluir </span></button>
			</h:commandLink>
		</a4j:region>

		<br />
		<br />
		<br />

		<a4j:region>
			<rich:dataTable value="#{categoriaAction.CarregaCategoriasGrid()}"
				var="categoria" rows="20">
				<rich:column>
					<f:facet name="header">
						<h:outputText value="Sequencial" />
					</f:facet>
					<h:outputText value="#{categoria.sequencialCategoria}"
						id="sequencial" />
				</rich:column>
				<rich:column>
					<f:facet name="header">
						<h:outputText value="Nome da Categoria" />
					</f:facet>
					<h:outputText value="#{categoria.nomeCategoria}" id="nome" />
				</rich:column>
				<rich:column>
					<f:facet name="header">
						<h:outputText value="Descrição" />
					</f:facet>
					<h:outputText value="#{categoria.descricaoCategoria}" id="descricao" />
				</rich:column>
				<rich:column>
					<f:facet name="header">
		                        Ações
		                	</f:facet>
					<a4j:commandLink ajaxSingle="true" id="editlink"
						action="#{categoriaAction.CarregaCategoriaEditavel(categoria.sequencialCategoria)}"
						reRender="nomecat,desccat,seqcat">
						<h:graphicImage value="/images/icons/edit.gif" style="border:0" />
					</a4j:commandLink>
					<rich:toolTip for="editlink" value="Edit" />
					<a4j:commandLink ajaxSingle="true" id="deletelink"
						action="#{categoriaAction.CarregaCategoriaEditavel(categoria.sequencialCategoria)}"
						reRender="nomecat,desccat,seqcat">
						<h:graphicImage value="/images/icons/delete.gif" style="border:0" />
					</a4j:commandLink>
					<rich:toolTip for="deletelink" value="Delete" />
				</rich:column>

			</rich:dataTable>
		</a4j:region>


		<rich:messages></rich:messages>


		<br />
	</a4j:form>
</f:view>
</body>
</html>

Valeu,
romulor2

Criado 4 de março de 2011
Respostas 0
Participantes 1