Problema com Hibernate

2 respostas
S

Boa noite,

Estou utilizando JSF + Hibernate e tenho a seguinte situação: Um cadastro de usuários, onde o usuário deve informar a privacidade do perfil dele (Como uma rede social). Essas privacidades são cadastradas manualmente pelo programador e ficam numa tabela diferente que faz referencia com a tabela de usuário (Existe uma chave estrangeira na tabela de usuário apontando para ID da privacidade), um exemplo das privacidades são ‘Só Amigos’,‘Todos’ e etc. Com isso vamos ao meu problema.

Problema: Quando vou fazer minha tela para listar os usuários cadastrados, se eu for tentar listar 2 usuários que apontem pra mesma privacidade ele da o seguinte erro:

Jan 18, 2012 9:02:02 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/BI2Events] threw exception [javax.servlet.ServletException: More than one row with the given identifier was found: 1, for class: bi2.events.usuario.Usuario] with root cause
org.hibernate.HibernateException: More than one row with the given identifier was found: 1, for class: bi2.events.usuario.Usuario
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:108)
	at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:160)
	at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1777)
	at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:674)
	at org.hibernate.type.EntityType.resolve(EntityType.java:434)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:140)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898)
	at org.hibernate.loader.Loader.doQuery(Loader.java:773)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
	at org.hibernate.loader.Loader.doList(Loader.java:2294)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
	at org.hibernate.loader.Loader.list(Loader.java:2167)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
	at bi2.events.usuario.UsuarioDAOHibernate.listar(UsuarioDAOHibernate.java:44)
	at bi2.events.usuario.UsuarioRN.listar(UsuarioRN.java:36)
	at bi2.events.web.UsuarioBean.getLista(UsuarioBean.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:193)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:181)
	at javax.faces.component.UIData.getValue(UIData.java:557)
	at javax.faces.component.UIData.getDataModel(UIData.java:1297)
	at javax.faces.component.UIData.setRowIndex(UIData.java:450)
	at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:828)
	at javax.faces.component.UIData.encodeBegin(UIData.java:940)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:509)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at bi2.events.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:18)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Sendo que esté comportamento é para acontecer, eu posso ter mais de um usuário que tenha adicionado sua privacidade apontando para o ID 1 = ‘Só Amigos’.
Como posso fazer para o hibernate não dar esse problema ? Eu sei que o problema se encontra nessa parte pois cadastrei 2 usuários e coloquei as privacidades dos mesmos diferentes e a listagem aconteceu sem nenhum problema.

Obrigado a todos.

2 Respostas

Hebert_Coelho

Como que vc está tentando fazer essa listagem?

S

Vou colocar so as respectivas partes, se precisar de maiores informações é só me avisar.

XHTML

<?xml version="1.0" encoding="ISO-8859-1" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
	<title>Cadastro de Usuários</title>
</h:head>

<h:body>
	<h1>Cadastro de Usuários</h1>
	<h:form>
		<h:messages />
		<h:dataTable value="#{usuarioBean.lista}" var="usuario" rules="rows" cellpadding="5">
			<f:facet name="caption">
				A listagem a seguir exibe a relação de todos os usuários do sistema. Você poderá realizar a edição e exclusão dos usuários.
			</f:facet>
			<h:column>
				<f:facet name="header">Código</f:facet>
				#{usuario.idUsuario}
			</h:column>
			<h:column>
				<f:facet name="header">Nome</f:facet>
				#{usuario.nomeUsuario}
			</h:column>
			<h:column>
				<f:facet name="header">Email</f:facet>
				#{usuario.emailUsuario}
			</h:column>
			<h:column>
				<h:commandLink action="#{usuarioBean.editar}">
					<h:graphicImage library="imagens" name="editar16.png" style="border:0"/>
					<f:setPropertyActionListener target="#{usuarioBean.usuario}" value="#{usuario}"/>
					<f:setPropertyActionListener target="#{usuarioBean.destinoSalvar}" value="/admin/painelAdmin"/>
				</h:commandLink>
			</h:column>
			<h:column>
				<h:commandLink action="#{usuarioBean.excluir}" onclick="if (!confirm('Confirma e exclusão do usuário #{usuario.nomeUsuario}?')) return false;">
					<h:graphicImage library="imagens" name="excluir16.png" style="border:0"/>
					<f:setPropertyActionListener target="#{usuarioBean.usuario}" value="#{usuario}"/>	
				</h:commandLink>
			</h:column>			
		</h:dataTable>
	</h:form>	
</h:body>
</html>

BEAN

@ManagedBean(name="usuarioBean")
@RequestScoped
public class UsuarioBean {
	
	private Usuario usuario = new Usuario();
	private Endereco endereco = new Endereco();
	private Pais pais = new Pais();
	private Estado estado = new Estado();
	private Cidade cidade = new Cidade();
	private PrivacidadeUsuario privacidadeUsuario = new PrivacidadeUsuario();
	private String destinoSalvar;
	public List<Usuario> lista;
	
	public List<Usuario> getLista() {
		if (lista == null) {
			UsuarioRN usuarioRN = new UsuarioRN();			
			lista = usuarioRN.listar();			
		}
		return lista;
	}
			
	public String novo() {
		setDestinoSalvar("usuarioSucesso");
		usuario = new Usuario();
		endereco = new Endereco();
		pais = new Pais();
		estado = new Estado();
		cidade = new Cidade();
		privacidadeUsuario = new PrivacidadeUsuario();
		return "usuario";
	}
	
	public String salvar() {
		EnderecoRN enderecoRN = new EnderecoRN();
		endereco.setPais(pais);
		endereco.setEstado(estado);
		endereco.setCidade(cidade);
		enderecoRN.salvar(endereco);				
						
		UsuarioRN usuarioRN = new UsuarioRN();
		usuario.setEndereco(endereco);
		usuario.setPrivacidadeUsuario(privacidadeUsuario);
		usuarioRN.salvar(usuario);		
		return getDestinoSalvar();
	}
	
	public String editar() {		
		return "/publico/usuario";
	}
	
	public String excluir() {
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.excluir(usuario);
		lista = null;
		return null;
	}	
	//GET e SET
	public Usuario getUsuario() { return usuario; }			
	public void setUsuario(Usuario usuario) { this.usuario = usuario; }
	public Endereco getEndereco() { return endereco; }
	public void setEndereco(Endereco endereco) { this.endereco = endereco; }
	public Pais getPais() { return pais; }
	public void setPais(Pais pais) { this.pais = pais; }
	public Estado getEstado() { return estado; }
	public void setEstado(Estado estado) { this.estado = estado; }
	public Cidade getCidade() { return cidade; }
	public void setCidade(Cidade cidade) { this.cidade = cidade; }
	public PrivacidadeUsuario getPrivacidadeUsuario() { return privacidadeUsuario; }
	public void setPrivacidadeUsuario(PrivacidadeUsuario privacidadeUsuario) { this.privacidadeUsuario = privacidadeUsuario; }
	public String getDestinoSalvar() { return destinoSalvar; }
	public void setDestinoSalvar(String destinoSalvar) { this.destinoSalvar = destinoSalvar; }
	//Construtor
	public UsuarioBean() {}
}

Método Listar

public List<Usuario> listar() {
		Criteria criteria = session.createCriteria(Usuario.class);
		criteria.addOrder(Order.asc("idUsuario"));
		List<Usuario> usuarios = criteria.list();
		return usuarios;		
	}

PS: Estou usando o conceito de Open Session in View, não sei se isso tem alguma coisa relacionado ao problema mais só pra resaltar.

Obrigado

Criado 18 de janeiro de 2012
Ultima resposta 18 de jan. de 2012
Respostas 2
Participantes 2