Referência Circular no Spring

Olá a todos.

        Estou com um erro de referência circular na minha aplicação. Este erro acontece quando um Bean estancia o outro, por exemplo:
public class BeanA {

   private BeanB b;

   //Obs: Tirei a configuração a inicialização do objeto do construtor
   // e deixando somente no método setBeanB. Teoricamente isso deveria
   // resolver, mas não adiantou.
  public BeanA() {
  }

  public void setBeanB(BeanB b) {
    this.b = b;
  }
  // A classe continua........


public class BeanB {

 private BeanA a;

 public BeanB() {}

 public void setBeanA(BeanA a) {
   this.a = a;
 }

// A classe continua...

No meu caso qui é um pouco diferente, pois estou utilizando Hibernate para a persistência dos dados. A referência circular gerada pelo Spring ocorre quando possuo um relacionamento ManyToMany entre os Beans. Este é um trecho de código das minhas duas classes, Aluno e Responsavel.

Classe Aluno

@Scope("prototype")
@Component(value = "aluno")
@Entity
@Table(name = "ALUNO")
public class Aluno implements java.io.Serializable {

	private static final long serialVersionUID = 1L;

       // Mapeamento do Hibernate para o relacionamento
       @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
       @JoinTable(name = "RESPONSAVELALUNO", joinColumns = @JoinColumn(name = "IDALUNO"),
			inverseJoinColumns = @JoinColumn(name = "IDRESPONSAVEL"))
	private Collection<Responsavel> responsaveis;

        public Aluno() {
        }

        public Collection<Responsavel> getResponsaveis() {
		return responsaveis;
	}

	public void setResponsavel(Collection<Responsavel> responsaveis) {
		this.responsaveis = responsaveis;
	}

Classe Responsavel

@Scope("prototype")
@Component(value = "responsavel")
@Entity
@Table(name = "RESPONSAVEL")
public class Responsavel implements java.io.Serializable {

	private static final long serialVersionUID = 1L;

        // Mapeamento Hibernate para o Relacionamento
        @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
        @JoinTable(name = "RESPONSAVELALUNO", joinColumns = @JoinColumn(name = "IDRESPONSAVEL"),
			inverseJoinColumns = @JoinColumn(name = "IDALUNO"))
        private Collection<Aluno> aluno;

        public Responsavel() {
        }

        public Collection<Aluno> getAluno() {
		return aluno;
	}

	public void setAluno(Collection<Aluno> aluno) {
		this.aluno = aluno;
	}

O erro somente ocorre quando tento salvar um Aluno ou salvar um Responsável através do Spring com o Hibernate. Vai o código do erro quando tentei salvar um Responsável:

17/02/2009 09:49:28 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'responsavel': 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)

Pelo que percebi o diferencial é que estou referenciando os objetos utilizando Collection justamente pelo relacionamento ManyToMany do Hibernate. Pesquisei bastante mas não encontrei nada.
Se alguém puder me ajudar agradeço muito…

Abraço…

Não seria setResponsaveis … você está usando setResponsavel…

Para referência circular no Spring tem a opção do lazy-init e marcar uma propriedade com AutoWired false se você não quizer que o Spring resolva a dependência.

Beleza Arnaldo ?

Realmente era a assinatura do meu método setResponsaveis e não setResponsavel como vc disse. Ratiada minha hehehe…
Valeu pela ajuda…

Abraço…