Spring2+Hibernate3: Illegal attempt to associate collection

Olá Pessoal,

Estou fazendo alguns testes usando o Spring 2.0.6 e o Hibernate 3.2

Já procurei em vários forums e no Google mas não achei uma solução para este problema. Apesar de exception se repetir em

alguns posts do forum. A exception é:

Exception in thread "main" org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a 

collection with two open sessions; nested exception is org.hibernate.HibernateException: Illegal attempt to associate a 

collection with two open sessions
Caused by: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Bom, deixe-me mostrar o que estou fazendo:

Classe main que cria um contexto

public class Test1 {
	
	UserService userService;

	public static void main(String[] args) {
		Test1 test1 = new Test1();
		test1.userService.remove(new Long(1)); // 1 é o id de um registro no banco de dados
	}
	
	public Test1() {
		userService = (UserService)SpringContext.getSpringContext().getService("userService");		
	}

}

classe UserService

public class UserService {

	...

	public void remove(Long id) {
		User user = getUserDao().load(id); // esta linha funciona
		if (user!=null) {
			getUserDao().delete(user); // aqui dá o erro
		}
	}
	
	...
}

o meu DAO é uma classe genérica do Urubatan, ai vai os trechos:

@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public abstract class HibernateBaseDao<T, PK extends Serializable> extends HibernateDaoSupport implements IBaseDao<T, PK> {
	
	...

	@SuppressWarnings("unchecked")
    	public T load(PK primaryKey) {
        	try {
	            return (T) getSession().load(objectClass, primaryKey);
        	} catch (HibernateException e) {
	            throw convertHibernateAccessException(e);
        	}
	}

    	public void delete(PK object) {
    		try {
    			getSession().delete(getSession().load(objectClass, object));
	        } catch (HibernateException e) {
        	    throw convertHibernateAccessException(e);
	        } 
	}

	...

}

Bom, eu sei que a exception está relacionada a duas sessões, mas como eu acho que o spring gerencia isto, eu não sei como

contornar este problema.

Alguém sabe como resolver isto?

Muito obrigado pessoal!!!

Claudiney

O getUserDao() retorna dois objetos DAO diferentes com sessions diferentes? Se sim, basta mudar o código do UserService.remove() para:

public void remove(Long id) {
 	UserDAO dao = getUserDao();
 	User user = dao.load(id); // esta linha funciona
	if (user!=null)
 		 dao.delete(user); // aqui dá o erro
}

Não. Na verdade o getUserDao() é um simples método get.

public IUserDao getUserDao() { return userDao; }

Na verdade este atributo é preenchido pelo Spring no applicationContext-hibernate.xml

	<bean id="userDao" class="br.com.atualinformatica.core.dao.hibernate.HibernateUserDao">
		<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
	</bean>
	
	<bean id="userService" class="br.com.atualinformatica.core.business.UserService">
		<property name="userDao"><ref bean="userDao"/></property>
	</bean>

É bem estranho mesmo… pois no meu entendimento o Spring que gerencia isto :frowning:

Obrigado pessoal

O pessoal,

Será que ninguém passou por isso?

Um comentário: quando eu faço teste só com o Hibernate, criando meu próprio SessionFactory eu não tenho este problema.

O que pode estar errado neste uso do Spring? Eu apenas me basiei em códigos de projetos de exemplo e pensei que deveria funcionar.

calixto, você conseguiu resolver o problema??

UP!!!

MESMO PROBLEMA!!!