Spring + Hibernate - Problemas com o applicationContext, Lazy e Cast

2 respostas
Lucas_Lacerda_Gertel

Bom dia a todos!
Estou com alguns problemas no gerenciamento de sessões que o Spring faz sobre o Hibernate.
Estou evitando utilizar o HibernateDaoSupport, e isso está me trazendo muitoooos problemas.

Já implementei transactions e tudo o que li a respeito mas não rolou de jeito nenhum.
Estou com dois problemas, um de cast quando utilizo transactions ou um de sessão fechada quando não.
Help!

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
		<property name="configLocation" value="hibernate.cfg.xml"/>
	</bean>
  
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    	<property name="sessionFactory" ref="sessionFactory"/>
  	</bean>
	
  	<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
   		<property name="transactionManager" ref="txManager" />
   		<property name="transactionAttributeSource">
	  		<value>
	         	wmc.affiliate.model.simple.SimpleCustomerManager.*=PROPAGATION_REQUIRES_NEW,-Exception
	  		</value>
   		</property>
  	</bean>
  	
  	<bean id="customerManager" class="org.springframework.aop.framework.ProxyFactoryBean">
  		<property name="proxyInterfaces">
      		<value>wmc.affiliate.orm.model.manager.CustomerManager</value>
   		</property>
   		<property name="target">
   			<bean class="wmc.affiliate.model.simple.SimpleCustomerManager">
   				<property name="sessionFactory" ref="sessionFactory"/>
  			</bean> 
   		</property>
	   	<property name="interceptorNames">
	    	<list>
	        	<value>transactionInterceptor</value>
	      	</list>
   		</property>
  	</bean>
</beans>

Agora a interface, implementação e chamada!

Customermanager

package wmc.affiliate.orm.model.manager;

import java.util.List;

import wmc.affiliate.orm.model.Customer;

public interface CustomerManager {

	public List<Customer> listCustomers();
}

SimpleCustomerManager

package wmc.affiliate.model.simple;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;

import wmc.affiliate.orm.model.Customer;
import wmc.affiliate.orm.model.manager.CustomerManager;

public class SimpleCustomerManager implements CustomerManager {
	
	private SessionFactory sessionFactory;
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	public SessionFactory getSessionFactory() {
		return this.sessionFactory;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Customer> listCustomers() {
		
		List<Customer> customers = null;
		Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
		
		customers = session.createCriteria(Customer.class).list();
		
		return customers;
	}

}

E alguns testes…

package wmc.affiliate.orm;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import wmc.affiliate.model.simple.SimpleCustomerManager;
import wmc.affiliate.orm.model.Customer;
import wmc.affiliate.orm.model.Email;
import wmc.affiliate.orm.model.manager.CustomerManager;

public class InsertCustomerEmail {
	
	public static void main(String[] args) {
		Customer customer = new Customer();
		customer.setName("Lucas");
		customer.setLastName("Gertel");
		customer.setPhone("0000");
		
		Email email = new Email();
		email.setEmail("[email removido]");
		email.setCustomer(customer);
		
		Email email2 = new Email();
		email.setEmail("[email removido]");
		email2.setCustomer(customer);
		
		List<Email> emails = new ArrayList<Email>();
		emails.add(email);
		emails.add(email2);
		
		customer.setEmails(emails);
		
		
		
		Resource resource = new FileSystemResource("applicationContext.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		
		//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		Object object = factory.getBean("customerManager");
		
		System.out.println(object.toString());
		
		//SimpleCustomerManager customerManager = (SimpleCustomerManager)object;
		//CustomerManager customerManager = (SimpleCustomerManager)factory.getBean("customerManager");

		/*
		List<Customer> customers = customerManager.listCustomers();
		
		for (Customer customer2 : customers) {
			System.out.println(customer2.getLastName());
			
			List<Email> emails2 = customer2.getEmails();
			for (Email email3 : emails2) {
				System.out.println(email3.getEmail());
			}
		}
		*/
	}
}

Alguém sabe o que pode estar errado?
Abraços a todos.

2 Respostas

Lucas_Lacerda_Gertel

Esqueci de postar um dos erros…

Exception in thread “main” java.lang.ClassCastException: $Proxy14 cannot be cast to wmc.affiliate.model.simple.SimpleCustomerManager
at wmc.affiliate.orm.InsertCustomerEmail.main(InsertCustomerEmail.java:49)

Isso na linha comentada

SimpleCustomerManager customerManager = (SimpleCustomerManager)object;

e com o método em SimpleCustomerManager

@SuppressWarnings("unchecked")
	@Override
	public List<Customer> listCustomers() {
		
		List<Customer> customers = null;
		customers = sessionFactory.getCurrentSession().createCriteria(Customer.class).list();
		
		return customers;
	}

Abraços!

rodrigo_corinthians

Pergunta porq vc está evitando estender o HibernateDaoSupport?? Já que sem ele vc não terá as principais features do Spring…

Criado 20 de dezembro de 2007
Ultima resposta 20 de dez. de 2007
Respostas 2
Participantes 2