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