Hibernate + Spring : Episódio 1 [Resolvido. + ainda não entendi o PQ]

1 resposta
proteus_adi

Bom...
Depois de passar a semana inteira lendo a respeito...
Tentei fazer um código com spring e hibernate.

Este é o applicationContext.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
       <bean id="sessionFactory"
             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
              <property name="mappingResources">
                     <list>
                            <value>Pessoa.hbm.xml</value>
                     </list>
              </property>
              <property name="hibernateProperties">
                     <props>
                            <prop key="hibernate.dialect">org.hibernate.dialect.FirebirdDialect</prop>
                            <prop key="hibernate.connection.driver_class">org.firebirdsql.jdbc.FBDriver</prop>
                            <prop key="hibernate.connection.url">jdbc:firebirdsql://localhost:3050/D:\\DADOS\\SGCP.FDB</prop>
                            <prop key="hibernate.connection.username">SYSDBA</prop>
                            <prop key="hibernate.connection.password">masterkey</prop>
                     </props>
              </property>
       </bean>
       <bean id="transactionManager"
             class="org.springframework.orm.hibernate3.HibernateTransactionManager">
              <property name="sessionFactory">
                     <ref bean="sessionFactory"/>
              </property>
       </bean>
       <bean id="pessoaDao" class="hibernate.PessoaDao">
              <property name="sessionFactory">
                     <ref bean="sessionFactory"/>
              </property>
       </bean>
</beans>
Esse é meu DAO
public class PessoaDao extends HibernateDaoSupport {
    SessionFactory sessionFactory;
        
    public PessoaDao() {
    }

    int save(Pessoa p) {
        Session session = getSession(false);
        session.saveOrUpdate(p);

        return 1;
    }

    boolean delete(Pessoa p) {
        Session session = getSession(false);
        session.delete(p);
        return true;
    }

    Pessoa load(int id_pessoa) {
        Session session = getSession(false);
        Query qr = 
            session.createQuery("from Pessoa where id_pessoa = :id_pessoa");
        qr.setInteger("id_pessoa", id_pessoa);
        return (Pessoa)qr.uniqueResult();
    }

}
E este... meu teste
public class Teste {

    public static void main(String[] args) {
        Resource resource = new FileSystemResource("applicationContext.xml");
        BeanFactory fa = new XmlBeanFactory(resource);

        PessoaDao pd = (PessoaDao)fa.getBean("pessoaDao");

        Pessoa p = new Pessoa();
        p.setNome("Nome");

        pd.save(p);
    }
}
e ESTE é o erro:
Exception in thread "main" java.lang.IllegalStateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
	at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:350)
	at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:200)
	at org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSession(HibernateDaoSupport.java:169)
	at hibernate.PessoaDao.save(PessoaDao.java:15)
	at hibernate.Teste.main(Teste.java:26).

EU imagino que existe alguma coisa que eu achei que seria automática... mas não foi...
Hibernate-3.2.7 e Spring-3.0.0M

É o ponta pé inicial que falta...

1 Resposta

proteus_adi

o Session session = getSession(false);
se substituído por Session session = getHibernateTemplate().getSessionFactory().openSession();

Mas…
Por que?

?!

Criado 3 de julho de 2009
Ultima resposta 4 de jul. de 2009
Respostas 1
Participantes 1