Referência Circular - Spring

3 respostas
cristianopagani

Olá a todos.

Estou com o seguinte problema:
A aplicação utiliza Hibernate + Spring + Struts, e para as telas utiliza um framework javascript ExtJS.
Possuo duas entidades: Funcionario e HoraTrabalhada, essas entidades se relacionam, abaixo o código:

Funcionario.java
package com.lpinformatica.sistemaponto.model.schema.administracao;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("prototype")
@Component(value = "funcionario")
@Entity
@Table(name = "FUNCIONARIO")
public class Funcionario implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDFUNCIONARIO")
	private Integer idFuncionario;

	@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, optional = false)
	@JoinColumn(name = "IDCARGO")
	private Cargo cargo;

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
	@JoinColumn(name = "IDLOGRADOURO")
	private Logradouro logradouro;

	@Column(name = "NOME", nullable = false, length = 60)
	private String nome;

	@Column(name = "DATAADMISSAO", nullable = true)
	@Type(type = "date")
	private Date dataAdmissao;

	@Column(name = "CPF", length = 14, nullable = false)
	private String cpf;

	@Type(type = "text")
	@Column(name = "SENHABIOMETRIA", nullable = true)
	private String senhaBiometria;

	@Column(name = "RG", length = 10, nullable = false)
	private String rg;

	@Column(name = "PIS", length = 14, nullable = false)
	private String pis;

	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST, optional = true)
	@JoinColumn(name = "IDUSUARIO", unique = true)
	private Usuario usuario;

       // Relacionamento em questão, aparentemente onde o erro está relacionado....
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "funcionario")
	private Set<HoraTrabalhada> horasTrabalhadas;
       //-----------------------------------------------------------------------------------------

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "funcionario")
	private CargaHorariaFuncionario cargaHorariaFuncionario;

	@Column(name = "NUMEROCASA", nullable = true)
	private Integer numeroCasa;

        // Abaixo estão os construtores de métodos geters e seters
HoraTrabalhada.java
package com.lpinformatica.sistemaponto.model.schema.administracao;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("prototype")
@Component(value = "horaTrabalhada")
@Entity
@Table(name = "HORATRABALHADA")
public class HoraTrabalhada implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDHORATRABALHADA")
	private Integer idHoraTrabalhada;

       //Método em questão, onde aparentemente o erro está relacionado
	@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "IDFUNCIONARIO")
	private Funcionario funcionario;
        //-------------------------------------------------------------------------------------------

	@Column(name = "HORAENTRADA", nullable = false)
	@Type(type = "time")
	private Date horaEntrada;

	@Column(name = "HORASAIDAINTERVALO", nullable = true)
	@Type(type = "time")
	private Date horaSaidaIntervalo;

	@Column(name = "HORAENTRADAINTERVALO", nullable = true)
	@Type(type = "time")
	private Date horaEntradaIntervalo;

	@Column(name = "HORASAIDA", nullable = true)
	@Type(type = "time")
	private Date horaSaida;

	@Column(name = "DATAPONTO", nullable = false)
	@Type(type = "date")
	private Date dataPonto;
        
        //Abaixo estão os contrutores e métodos

A aplicação inicia normalmente, mas quando tento cadastrar um funcionário utilizando o hibernate ocorre uma excessao:

28/01/2009 15:17:17 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'funcionario': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:224)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByName(AbstractAutowireCapableBeanFactory.java:1029)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:977)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByName(AbstractAutowireCapableBeanFactory.java:1029)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:977)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:881)
	at com.lpinformatica.wframe.web.action.TableInterceptor.intercept(TableInterceptor.java:166)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
	at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	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:191)
	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:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

Conforme a exception ocorre um erro ao tentar criar o bean "funcionario". Já fiz diversas busca na web sobre esta questão, mas não consegui encontrar nada que resolvesse meu problema.
Agradeço à todos pela ajuda dos colegas.

Abraço.

3 Respostas

J

Você está usando o spring, para criar beans dos seus pojos ?

Tipo:

<bean class="com.lpinformatica.sistemaponto.model.schema.administracao.Funcionario">
</bean>

Se estiver, posta o código xml ai.

cristianopagani

Acabei resolvendo aqui…

Se tratava de uma referência circular onde um bean estava chamando o outro...
Rafael_Carneiro

Poste o código da sua solução (como era antes e como ficou depois).

Criado 28 de janeiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 3
Participantes 3