comunicação entre: Spring + Hibernate + BD (standalone)

6 respostas
A

Ola pessoal!

Estou iniciando em Spring. Gostaria de utiliza-lo ao invés de usar Struts.
Assim estou tentando utilizar Hibernate + Spring + BD=MySql. Considerando que todos os mapeamentos O/R do Hibernate estão corretos, o seguinte código funciona perfeitamente:

Session sessao=null; Transaction tx=null; try { sessao= HibernateFabrica.abreSessao(); tx = sessao.beginTransaction(); sessao.save(evento); // todas as propriedades Bean evento // estão mapeadas corretamente no seu hbm.xml tx.commit(); }catch (HibernateException e) { HibernateFabrica.rollBack(tx); throw e; } finally{ HibernateFabrica.fechaSessao(sessao); HibernateFabrica.fechaFabrica(); }
Ou seja, os dados são verdadeiramente SALVOS no BD. No entanto, ao utilizar o Spring os dados NAO estão sendo salvos no BD, apesar do código compilar e executa corretamente, o que indica que todas as bibliotecas estão no classpath da aplicação. O código acima é substituido pelo código que utiliza Spring:

SessionFactory sf = HibernateFabrica.getFabricaSessao(); HibernateTemplate template = new HibernateTemplate(sf); template.save(evento);
A classe HibernateTemplate, é do Spring e assim esta assume toda a responsabilidade de abrir a sessão, a transação, gerenciar as exceções, bem como finalizar corretamente os recursos abertos. Assim, estou assumindo que o Spring utilizará o objeto SessionFactory, o qual tem todas as informações do arquivo Hibernate.cfg.xml como: username, password, url, Driver, e os hbm.xml

Estou utilizando o Hibernate 3.1, Spring FrameWork 1.2.8 e MySql 5.0.24. Considerando que estou utilizando somente os mapeamentos padrão do hibernate, gostaria de saber se para utilizar o Spring DEVE necessáriamente fazer algum mapeamento exclusivo para o Spring, ou se existe algo mais que deva ser feito para fazer este último código funcionar, ou seja, salvar verdadeiramente os dados no BD.

PS1: Um detalhe que observei ao executar o código com Spring é que as Primary Key no BD são incrementadas automaticamente ao rodar código, no entanto, nenhuma linha é inserida nas tabelas envolvidas.
PS2: Por enquanto trata-se de uma aplicação standalone, portanto, fora de um contexto de Servidor Web.

6 Respostas

J

Cara…
Me diz uma coisa…
Vc chegou a verificar se o hibernate está gerando a query de insert???
Se não está gerando vc pode estar com o mesmo problema que eu tinha…
Transações…
Demorei um bom tempo até conseguir deixar redondo…
Primeiro de tudo verifica se a query de insert está sendo gerada…

Aguardo sua resposta…

A

jr_klein:
Cara…
Me diz uma coisa…
Vc chegou a verificar se o hibernate está gerando a query de insert???
Se não está gerando vc pode estar com o mesmo problema que eu tinha…
Transações…
Demorei um bom tempo até conseguir deixar redondo…
Primeiro de tudo verifica se a query de insert está sendo gerada…

Aguardo sua resposta…

Query de insert? Hum… isso no hibernate é transparente para o programador. O meu problema é com o Spring. Ao executar o primeiro trecho de código tudo funciona corretamente. Ao substituir o 1º trecho pelo o 2º (com spring), os dados NAO sao inseridos na tabela. Neste caso pode ser que a query de insert NAO esteja sendo gerada. Mas ai já seria um bug do próprio Spring em si.

A

A propósito, estou “desconfiado” que o Spring NAO funciona fora de um contexto de Servidor de Aplicação Web como (Tomcat, JBoss etc). Pois no caso citado acima, estou supondo que o Spring.jar funcionaria em qualquer tipo de Aplicação, com por exemplo J2SE puro, com swing etc. O hibernate funciona de forma standalone e nao depende de Servidor Web.

J

Axo q vc ñ me entendeu bem…
Verifique na console (se vc usa o eclipse, ali onde aparece os println) se o insert aparece…
mas para ele aparecer vc precisa ter no seu context.xml uma propriedade do hibernate assim.

<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
			</props>
		</property>

Aquele show_sql é quem mostra o insert como se fosse um log.

Referente ao spring não funcionar fora do contexto web, ñ é verdade pois meus testes eu faço fora do contexto web e depois integro com a camada de apresentação.
Verifica ai qq coisa posta o teu xml de config do spring.

A

Cara, depois que você citou este context.xml, fui pesquisar sobre o assunto. Assim, uma vez que o arquivo applicationContext.xml entrou em cena, mais algumas classes de configuração, os dados passou a ser inseridos efetivamente no BD.

Antes eu estava usando somente a biblioteca Spring.jar, sem o arquivo applicationContext.xml. Dessa forma conclui-se que o Spring para funcionar de forma Stantalone deve-se ter os mapeamentos no arquivo applicationContext.xml.

Achei isso muito estranho, pois a classe HibernateTemplate do Spring recebe um objeto SessionFactory do Hibernate com todas as configurações do arquivo Hibernate.cfg.xml, o que seria conveniente que funcionasse SEM o arquivo applicationContext.xml.

Assim, utilizando o arquivo applicationContext.xml, fez com que o arquivo Hibernate.cfg.xml se tornasse TOTALMENTE inútil, podendo ser descartado como foi feito… e… tudo funcionou.

J

Cara agora ñ entendi mais nada…
Como q funcionava sem esse xml???
Como vc mapeava os benas do spring???

Se funcionou tá blz mas o interessante seria saber a real necessidade em utilizar o spring se vc ñ estava utilizando nem a Ioc dele…

Vc poderia dar uma lida sobre o spring e ver que ele pode proporcionar muito… Entendendo como funciona Ioc vc vai ver várias coisas que isso pode lhe proporcionar…
Quando precisar alguma coisa manda ai q se eu souber eu ajudarei…

Vlw

Criado 22 de agosto de 2006
Ultima resposta 23 de ago. de 2006
Respostas 6
Participantes 2