Como usar Spring e Hibernate sem HibernateTemplate

Pessoal, estou tentando usar o spring para configurar várias conexoes, estou criando o Dao em que preciso obter o session do hibernate, o porém é que não estou conseguindo achar a outra solução a não ser usar o HibernateTemplate do Spring, mas se puder não queria usar ele, pois acho que se for assim quebra a vantagem de usar Spring que é desacoplamento das dependencias, nesse caso o Spring vai sempre estar andando junto ao meu DAO e caso um dia for abandonar o Spring não poderei reaproveitar o mesmo jar e terei que achar o projeto dele e editar na mão.

Gostaria então saber como o pessoal faz para gerenciar DAO via spring :slight_smile:

É perfeitamente possivel. Você cria o bean SessionFactory, dai é só injetar esse bean nas classes DAO. Para maior portabilidade use as anotações @Inject e @Named ao invés das @Autowired e @Repository.

Sim, mas daí encontro novo problema:
SessionFactory é uma interface, tentei implementar mas é muita coisa para implementar mesmo.
Se eu colocar a notação no meu DAO estarei do mesmo jeito usando lib Spring então muda nada mesmo, mesmo que funcione(no sentido de que não vou precisar mecher nos codigos para reaproveita lo) acho que vou ter que incluir Spring em todos os projetos que forem usar o DAO ne?

Eu escrevi um tutorial sobre como integrar os dois sem usar HibernateTemplate (eu detesto essa forma), acho que vai te ajudar:

http://www.simpledev.com.br/spring-hibernate.html

Flw! :thumbup:

[quote=tsunemisan]Sim, mas daí encontro novo problema:
SessionFactory é uma interface, tentei implementar mas é muita coisa para implementar mesmo.
Se eu colocar a notação no meu DAO estarei do mesmo jeito usando lib Spring então muda nada mesmo, mesmo que funcione(no sentido de que não vou precisar mecher nos codigos para reaproveita lo) acho que vou ter que incluir Spring em todos os projetos que forem usar o DAO ne?[/quote]

Faça uma interface DAO e um DAO genérico. Esses 2 você usa para qualquer projeto. Dentro de cada projeto especifico você estende o DAO genérico nas classes especificas e nestas classes você usa as anotações.

Se você não quer usar anotações nos códigos, pode então usar o XML de configuração, como era feito anteriormente as anotações.

Você não vai precisar implementar a interface SessionFactory, o Spring prove de uma classe já implementada. É só criar o bean com ela. Da mesma maneira que você deve ter configurado a sessionfactory para usar com o hibernateTemplate.

Entao, que tava pensando em fazer era deixar o projeto DAO limpo, apenas hibernate e iria criar uma outra camada apenas de Spring.
Que von.juliano sugeriu precisa usar notacao do Spring, infelizmente se fose pra incluir lib dela HibernateTemplate nao faria mal.

So falta mesmo conseguir uma instancia do sessionFactory, que pelo classpath do hibernate ela e uma interface xD

von.juliano no seu blog tinha conguracao do bean sem setar o class, desculpa a ignorancia mas como funciona?

[quote=tsunemisan]Entao, que tava pensando em fazer era deixar o projeto DAO limpo, apenas hibernate e iria criar uma outra camada apenas de Spring.
Que von.juliano sugeriu precisa usar notacao do Spring, infelizmente se fose pra incluir lib dela HibernateTemplate nao faria mal.

So falta mesmo conseguir uma instancia do sessionFactory, que pelo classpath do hibernate ela e uma interface xD

von.juliano no seu blog tinha conguracao do bean sem setar o class, desculpa a ignorancia mas como funciona?[/quote]

Você pode fazer isso, é só não usar a injeção de depencias do Spring nos DAOs. Mas dai não vejo vantagem em usar o Spring.

Amigo, não me entenda mal, mas você está familiarizado com o Spring? Sabe para que ele é usado? Pergunto porque “uma camada apenas de Spring” não faz sentido.

[quote=tsunemisan]Que von.juliano sugeriu precisa usar notacao do Spring, infelizmente se fose pra incluir lib dela HibernateTemplate nao faria mal.
So falta mesmo conseguir uma instancia do sessionFactory, que pelo classpath do hibernate ela e uma interface xD[/quote]
Você quer usar o Spring ou não? Você não quer usar o pacote orm, é isso?

Imagino que você se refira a não usar o xml, já que nele você deixa bem especifico qual classe é injetada onde. Com a configuração que coloquei no xml, o Spring varre as classes procurando as que estão anotadas (@Repository, @Service) e as injeta diretamente nas classes que esperam um “candidato” para injeção (um HibernateCarroDao é uma implementação de CarroDao, então é um bom candidato). Como há apenas uma implementação de cada interface para ser injetada, o Spring injeta a única opção que tem, mas caso sejam criadas várias implemetações, é necessário dar um nome para cada, e na classe com @Autowired é preciso indicar qual implementação você quer, referenciando-a pelo nome.

O que quero fazer é aproveitar o IoC sem precisar acoplar nada no meu DAO, o proprio Spring diz que ele veio para existindo ou não o sistema funcionar, porém se eu usar notações e tals vou ser obrigado a incluir lib spring o que prejudicará na portabilidade, já pensou não ter opção e todos que necessitam do DAO projetos terá que usar Spring? E tenho fonte dizendo que como HibernateTemplate deixa muito acoplado, futuramente deixará de ser usado, afinal ele da open, commit ou rollback e close automático e sei fazer isso na mão e ainda saio ganhando desacoplando todos libs que afinal já uso chamado hibernate.

Sim, não queria usar ORM e se qualquer outra coisa criar dependencia no projeto o Spring inteiro xD

E vlw a explicação, mas queria mesmo era usar apenas o xml que tira dependencia das minhas classes com a notação e consequentemente do Spring

Entendi. Você consegue sim fazer com o xml, mas se não quer usar o spring-orm vai ter que fazer o controle de transações e do ciclo de vida da Session na mão. E se quiser usar o projeto em outro lugar sem o Spring, vai ter de fazer as injeções na mão também.

Uma dica: cuidado com a grafia e use a pontuação de forma adequada, está dificil entender o que você quer dizer em seus posts.

Desculpa, preciso melhorar muito a grafia e pontuação que nunca fui bom xD
E vlw pelas rápidas respostas e ajuda, vou vendo mesmo direito que estou apenas começando com Spring que o mercado tanto exige e não entendo o por que xD

Disponha :mrgreen:. Sobre o Spring, não se preocupe, muita gente só usa por usar, é dificil entender o porque. Então foque em aprender porque utilizá-lo, ou no caso, porque usar injeção de dependência.

Vou te dar uma linha que talvez ajude. Leia esse post, que espero que desperte sua curiosidade, então leia o livro, onde vai haver tópicos sobre testes e design das suas classes. Aprenda sobre testes e TDD, inevitavelmente você vai cair em DI. Nesse ponto você vai entender bem porque usar o Spring (ou Guice, ou Pico).

Bons estudos! Flw! :thumbup:

Olá Pessoal. Boa noite.
Eu estou tentando criar e configurar uma aplicação sem o HibernateTemplate, mas não estou conseguindo.
Eu realizei as mesmas configurações que o vonjuliano disse, eu segui pelo post dele do blog (http://vonjuliano.wordpress.com/2011/10/04/integrando-spring-e-hibernate/)
Ainda assim, me é apresentado o erro:

O erro ocorre porque no construtor do HibernateUsuarioDao é esperado como parâmetro o SessionFactory, mas por algum motivo ele não recebe.
Spring e JSF são novidades ainda pra mim, e por isso eu apanho pra configurar. Se alguém puder dar uma força. É só pra configurar mesmo, porque “depois vai”… rs

Eu criei um projeto de JSF + Spring e este funciona certinho:
SVN https://sourceforge.net/p/jsfspring/code-0/2/tree/
RAR http://sourceforge.net/projects/jsfspring/files/jsfspring.rar/download

Quando peguei o mesmo projeto, que já funcionava, e tentei acrescentar o Hibernate (JSF + Spring + Hibernate) começou a dar o problema que citei acima:
SVN https://sourceforge.net/p/jsfspringhib/code-0/2/tree/
RAR http://sourceforge.net/projects/jsfspringhib/files/jsfspringhib.rar/download

Configurei o mínimo nos XMLs, achei bem legal essa “forma resumida”. E e embora o DAO esteja declarado no applicationContext.xml, gostaria de dizer que foi só um teste que eu vi seguindo um outro link, só está lá por estar, mas o erro acontece do mesmo jeito se eu tiro ele de lá. O certo é não estar lá, como disse, foi só um teste mesmo.

Alguém poderia dar uma ajuda para eu entender o que eu estou fazendo de errado?!

Desde já, queria agradecer aí ao Von Juliano pelo conteúdo disponibilizado e também pela atenção.
Von Juliano, coloquei aqui porque assim não encho só o seu saco… rs… :stuck_out_tongue:

Obrigado galera.

Abraço.

Oi juniordocpd, baixei sua sua aplicação pra ver e encontrei alguns pequenos erros:

  • No applicationConfig.xml faltam os class dos beans dataSource e sessionFactory.
  • Pela estrutura do seu projeto, o configLocation da sessionFactory deve ser WEB-INF/hibernate.cfg.xml.
  • O HibernateUsuarioDao não deve estar no xml, não é necessário para as classes anotadas.
  • Faltam os jars spring-jdbc-3.0.6.jar e aopalliance-1.0.jar

Como já fiz aqui, segue o applicationContext.xml alterado:

[code]<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package="br.com.cjr" />
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource"
	class="org.springframework.jdbc.datasource.DriverManagerDataSource"
 	p:driverClassName="${jdbc.driver}" p:url="${jdbc.url}"
	p:username="${jdbc.username}" p:password="${jdbc.password}">
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="configLocation">
		<value>WEB-INF/hibernate.cfg.xml</value>
	</property>
</bean>

<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven />

[/code]Feito isso, vai funcionar! :mrgreen:

Blz? Flw! :thumbup:

E aí Juliano.
Cara, muito obrigado pela ajuda. Você foi preciso, funcionou perfeitamente.
Eu fiquei ainda com algumas dúvidas e gostaria de perguntar.

1. Sobre os jars, eu coloquei o spring-jdbc-3.0.6.jar. Já o aopalliance-1.0.jar eu fiquei da dúvida porque não entendi bem pra que serve esse jar, daí eu não coloquei e funcionou. Mas o projeto tem o “spring aop”, não sei se é o mesmo propósito e por isso pode ter funcionado.

2. Sobre os caminhos, eu sempre me atrapalho com isso. Eu acho que eu entendi, mais pra frente vou ver de configurar melhor isso, até mesmo colocando o maven, pra deixar melhor organizado essa estrutura que pretendo usar como base para projetos de estudo. (rs… isso nem é uma pergunta… rs)

3. Após rodar a aplicação, eu fiz uma modificação simples só para ver o carregamento de informações do banco.
Fui até a classe InformacoesService e modifiquei o método para uma coisa bem simples: pegar a lista de usuários e colocar em uma String.[code]
@Autowired
private HibernateUsuarioDao dao;

public String getInformacoeUsuario() {
    String retorno = "";
    List&lt;Usuario&gt; lista = dao.lista();
    for (Usuario usuario : lista) {
        retorno += (retorno.length()&gt;0?&quot;<br/>":"") + usuario.getFirstName() + " " + usuario.getLastName();
    }
    return retorno;
}

[/code]
Não mudei mais nada, como eu disse é bem boba a lógica.
Porém, quando compilo dá este erro:

Daí surgiu a dúvida. Achei que, após configurado o Hibernate, seria apenas injetar no meu service e usar.
Desculpe a falta de conhecimento cara, mas eu tenho que declarar algo no meu service ou em algum lugar referenciar este dao?
Parece ser mesmo problema de esperado 1 argumento e não recebido nenhum. Parece que não consegue passar o SessionFactory, fiquei na dúvida se eu tenho que ter algo declarado no meu service.

O service está anotado como @Service, como estava antes.

Sei que estou deixando passar alguma coisa, acho que é algo conceitual

Juliano, mais uma vez cara Muito Obrigado pela ajuda. Obrigado mesmo cara.

Abraço…

Opa Junior, sempre que possível, e tendo um tempinho, a gente procura ajudar! :mrgreen:

Sobre as suas dúvidas:

1 - aopalliance.jar o spring usa para aop. Quando subi aqui, simplesmente deu class not found e eu adicionei, se não te fez falta não tem problema, se for necessário você vai saber rapidamente.

2 - o meu exemplo usa o maven, como você não usa, achei importante apontar essa diferença.

3 - Aqui tenho duas observações importantes:
A primeira é que você não deve injetar o objeto diretamente na classe, pois o Spring simplesmente injeta o valor do campo passando por cima de qualquer outra prática ou princípio, o que dificultaria um teste unitário. Use o construtor, essa é a forma mais adequada, pois assim fica evidente que a classe depende do dao, garantindo programaticamente que ela não possa ser instanciada sem ele. O erro é dado por causa disso também.
A segunda é que você não deve ter uma referência à implementação na sua classe, mas à interface. Ao invés de HibernateUsuarioDao mantenha a referência a UsuarioDao:

[code]public class SuaClasse {

private UsuarioDao usuarioDao;

@Autowired
public SuaClasse(UsuarioDao usuarioDao) {
	this.usuarioDao = usuarioDao;
}

}[/code]Dessa forma, o design da sua classe fica muito melhor!

Qualquer dúvida é só perguntar!
Flw! :thumbup: