[Hibernate]Erro na associação one-to-one && one-to-many

3 respostas
felipeguerra

Pessoal,

Tenho o seguinte cenário: um Usuário possui várias Mensagens, por sua vez, a Mensagem possui um único Usuário, perfeito? Tentei mapear esse relacionamento para o Hibernate, mas na hora de por pra rodar, acontece certos problemas de acordo com o mapeamento abaixo:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	
	<class name="br.com.carona.web.vo.pessoa.Pessoa" table="PESSOA">
	
		<id name="idPessoa" column="idPessoa" type="integer">
			<generator class="identity" />
		</id>
		
		<property name="nome" column="nome" not-null="true" type="string" length="200" /> 
		<property name="dtNascimento" column="dtNascto" not-null="true" type="date" />
		<property name="rg" column="rg" not-null="false" type="string" length="15" />
		<property name="cpf" column="cpf" not-null="false" type="string" length="11" />
		<property name="celular" column="dcCelular" not-null="false" type="string" length="15" />
	
		<one-to-one name="endereco" 
					class="br.com.carona.web.vo.endereco.Endereco" 
					cascade="all" 
					foreign-key="idPessoa" 
					constrained="false" />
					
		<bag name="caronas" table="CARONA_PESSOA" fetch="join">
			<key>
				<column name="idPessoa" not-null="true" />
			</key>
			<many-to-many class="br.com.carona.web.vo.carona.Carona" column="idCarona" foreign-key="idCarona" />
		</bag>
	
		<joined-subclass name="br.com.carona.web.vo.usuario.Usuario" extends="br.com.carona.web.vo.pessoa.Pessoa" table="USUARIO">
			
			<key column="idPessoa" not-null="true" foreign-key="idPessoa" unique="true" />
			
			<property name="login" column="login" not-null="true" type="string" length="20" />
			<property name="senha" column="senha" not-null="true" type="string" length="200" />
			<property name="email" column="email" not-null="false" type="string" length="200" />
			<property name="ativo" column="flagAtivo" not-null="true" type="byte" />
			<property name="dtCadastro" column="dtCadastro" not-null="true" type="date" />
			
			<bag name="menus" table="USUARIO_MENU">
				<key>
					<column name="idPessoa" not-null="true" />
				</key>
				<many-to-many class="br.com.carona.web.vo.menu.Menu" column="idMenu" foreign-key="idMenu" />
			</bag>
			
			<bag name="mensagens" table="MENSAGEM" cascade="none" lazy="true">
				<key column="idPessoa" not-null="true" foreign-key="idPessoa" update="false" />
			 	<one-to-many class="br.com.carona.web.vo.mensagem.Mensagem" not-found="exception" />
			</bag>
		
		</joined-subclass>
	
	</class>

</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<class name="br.com.carona.web.vo.mensagem.Mensagem" table="MENSAGEM">
	
		<id name="idMensagem" column="idMensagem" type="integer">
			<generator class="identity" />
		</id>
	
		<property name="descricao" column="descricao" type="string" not-null="true" length="400" />
		<property name="dataEnvio" column="dataEnvio" type="date" not-null="true" />
		
		<one-to-one	name="usuario" 
					class="br.com.carona.web.vo.usuario.Usuario"
					cascade="none"
					constrained="false"
					foreign-key="idPessoa" />
					
	
		<property name="flagResposta" column="flagResposta" type="byte" not-null="true" />
	
	</class>

</hibernate-mapping>
1º Tentativa da inserção da primeira mensagem para um usuário X: SUCESSO!

2º Tentativa de cadastrar uma nova mensagem para o usuário X: ERRO!

Erro:
org.hibernate.PropertyAccessException: Exception occurred inside setter of br.com.carona.web.vo.mensagem.Mensagem.usuario
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
	at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
	at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
	at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:274)
	at br.com.carona.web.vo.usuario.Usuario.addMensagem(Usuario.java:146)
	at br.com.carona.web.vo.mensagem.Mensagem.setUsuario(Mensagem.java:94)
	at br.com.carona.web.mbean.faleconosco.FaleConoscoBean.enviarMensagem(FaleConoscoBean.java:54)
	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 org.apache.el.parser.AstValue.invoke(AstValue.java:131)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:180)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:158)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processApplication(AjaxViewRoot.java:346)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:100)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.carona.web.filter.LoginSessionFilter.doFilter(LoginSessionFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.carona.web.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
	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 org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
	... 63 more
Caused by: java.lang.IllegalArgumentException: Uma mensagem deve possuir um usuário associado
	at br.com.carona.web.vo.mensagem.Mensagem.setUsuario(Mensagem.java:90)
	... 68 more
Alguém pode me ajudar??

3 Respostas

felipeguerra

Estou tentando solucionar o problema, por enquanto nada.

Observando a minha mensagem anterior, fiz algumas mudanças e um novo erro surgiu. Ainda a inserção do primeiro objeto MENSAGEM ocorre sem problemas, mas daí pra frente...

Mensagem.hbm.xml
...
<one-to-one	name="usuario" 
					class="br.com.carona.web.vo.usuario.Usuario"
					cascade="none"
					constrained="true"
					foreign-key="idPessoa"
					lazy="no-proxy" />
Pessoa.hbm.xml
...

<joined-subclass name="br.com.carona.web.vo.usuario.Usuario" extends="br.com.carona.web.vo.pessoa.Pessoa" table="USUARIO">
			
			<key column="idPessoa" not-null="true" foreign-key="idPessoa" unique="true" />
			
			<bag name="mensagens" table="MENSAGEM" inverse="false" cascade="none" lazy="true">
				<key column="idPessoa" not-null="true" unique="false" update="true" on-delete="noaction" />
			 	<one-to-many class="br.com.carona.web.vo.mensagem.Mensagem" not-found="ignore" />
			</bag>
		
		</joined-subclass>
Exception
org.hibernate.PropertyAccessException: Exception occurred inside setter of br.com.carona.web.vo.mensagem.Mensagem.usuario
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
	at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
	at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
	at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:274)
	at br.com.carona.web.vo.usuario.Usuario.addMensagem(Usuario.java:146)
	at br.com.carona.web.vo.mensagem.Mensagem.setUsuario(Mensagem.java:94)
	at br.com.carona.web.mbean.faleconosco.FaleConoscoBean.enviarMensagem(FaleConoscoBean.java:54)
	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 org.apache.el.parser.AstValue.invoke(AstValue.java:131)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:180)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:158)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.processApplication(AjaxViewRoot.java:346)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:100)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.carona.web.filter.LoginSessionFilter.doFilter(LoginSessionFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.carona.web.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
	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 org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
	... 63 more
Caused by: org.hibernate.LazyInitializationException: illegal access to loading collection
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:274)
	at br.com.carona.web.vo.usuario.Usuario.addMensagem(Usuario.java:146)
	at br.com.carona.web.vo.mensagem.Mensagem.setUsuario(Mensagem.java:94)
	... 68 more

Obs: Estou usando o padrão Open Session In View

Leozin

posta o codigo dos teus beans

felipeguerra

Meu, olha a minha burrice: 1ª Entidade one-to-many; 2ª Entidade one-to-one;

Ou seja, acho que se não olhasse para isso, não ia funcionar nunca!

Mas agora está corrigido e funcionando…

Valeu

Criado 19 de março de 2008
Ultima resposta 20 de mar. de 2008
Respostas 3
Participantes 2