Série Spring: Aplicação JEE com JSF 2.0 + Spring 3.0

 

Olá Pessoal,

No post de hoje veremos como usar Spring em nossas aplicações JEE tendo o JSF no nosso front-end. Vou considerar que você já conhece o básico e configuração de cada um dos frameworks, mas na hora de fazer a integração, veio aquela pergunta: “E agora como faço?”.

Lets go… 

Starting…

Primeiramente precisamos ter nosso ambiente de desenvolvimento pronto, para isso  você precisa ter os .jars do JSF 2.x e do Spring core 3.x.  No nosso exemplo estou usando a versão do Spring 3.2 e o JSF 2.0.9 e como IDE optei pelo STS Tools. O motivo que ele  vem com vários plugins já por default  e é uma mão  na roda.

Nossos .jars:

  • – JSF 2.X
  • – Spring 3.x
  • -commons-logging-1.1.1.jar

Note: como Servidor app estou usando o Tomcat 7.0

Garanta que você já tem tudo isso antes de começar a desenvolver.

Desenvolvimento

Agora vamos meter mão na massa. Primeiro crie um Spring template Project  na lista de opções escolha Spring Hibernate Utility Apesar que não vamos usar nada de Hibernate, o template já vem com a estrutura do projeto para web e precisamos apenas dar uns tapas para ficar como queremos, para isso o projeto vai está “quebrando” ou seja, com uma exclamação:

helloSpringJSFProject

Note: se vc já tem um projeto JEE, só vai precisar adicionar suporte ao Spring.

Note 2: você também poderia criar um JSF Project e adicionar o Spring, enfim há N possibilidades.

Vamos deletar os arquivos que veio no template que não precisamos:

hellospringjsfdelete

Agora vamos adicionar suporte ao JSF para o projeto. Basta clicar com o botão direito do mouse no projeto e escolher:

 

configurejsfhellospringproject

Na tela a seguir bastar dar ok:

jsfscreenspringhello

Adicione os .jars na pasta lib:

 

jarslibhellopspring

Crie os packages a seguir:

hellospringpackages

A nossa aplicação será bem simples, daremos um Hello para um determinado usuário que será criado quando o método getUserInformation é invocado pelo controller.

User.java

public class User {

    private String name;

    private String lastName;

    private Integer age; 

//getters/setters  omitidos

}

Criaremos uma interface para o serviço

UserService.java

public interface UserService {

    public User getUserDetails();

}

 Agora temos a implementação da interface:

@Service

public class UserServiceImpl implements UserService {

     private User user;   

    public UserServiceImpl() {

     user = new User();

     user.setName(“camilo”);

     user.setLastName(“lopes”);

     user.setAge(10);

    }

    @Override

    public User getUserDetails() {       

        return user;

    } 

}

 Antes de criarmos a classe de controller precisamos fazer umas configurações no arquivo web.xml e também criarmos o nosso arquivo de configuração do Spring. Primeiro vamos alterar o web.xml

Adicione o cara que carrega as configurações do Spring

<listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

 </listener>

 

Vamos dizer para ele onde pegar as configurações do Spring:

<context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>/WEB-INF/springconfiguration.xml</param-value>

 </context-param>

 Apesar que não criamos  o arquivo springconfiguration.xml , mas não há problemas algum.

E agora vamos colocar o cara que permitirá utilizar os escopos padrões de uma aplicação web

<listener>

  <listener-class>org.springframework.web.context.request.RequestContextListener

</listener-class>

 </listener>

 E assim terminamos a configuração do web.xml

Face-config.xml

E agora vamos dizer ao JSF para delegar a criação do ManagedBeans para o Spring, mas para isso vamos alterar o arquivo face-config.xml

<face-config>

<application>

  <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

 </application>

</faces-config>

Criando o  arquivo de configuração do Spring

Aqui chamei meu arquivo de configuração do Spring de springconfiguration.xml e como vimos anteriormente informamos ele no web.xml para que ao iniciar aplicação o application context saiba onde e quem buscar.

hellpspringconfigurationfile

Portanto crie um arquivo .xml conforme a seguir:

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=“http://www.springframework.org/schema/context”

xsi:schemaLocation=“http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd”> 

<context:component-scan base-package=“*”/> 

</beans>

 

Só isso que precisamos. 

Criando a classe controller

UserController.java

@Controller

@Scope(“request”)

public class UserController {

    @Autowired

    private UserService userServ; 

    public User getUserInformation(){       

        return userServ.getUserDetails();

    }

    public void setUserServ(final UserService userServ) {

        this.userServ = userServ;

    }

}

Se você já conhece o Spring nada de especial aqui, apenas trocamos as anotações do JSF pela dos Spring.

Criando a página .xhtml

Vamos criar uma página home.xhtml que terá o código JSF. Para isso crie uma .xhtml withou facets.

E no body da página adiicone:

Hello <h:outputText value=“#{userController.userInformation.name}” />

 Agora clique com o botão direito do mouse no projeto e escolha Run On Server e o resultado será:

<img hellospringresultado>

Acessando http://localhost:8080/nomedoprojet/home.jsf

Note: lembrando que para dar suporte .jsf você precisa dizer isso no web.xml, assim:

<servlet-mapping>

  <servlet-name>Faces Servlet</servlet-name>

  <url-pattern>*.jsf</url-pattern>

 </servlet-mapping>

 

Pronto. Agora temos o nosso projeto JEE integrado com o Spring e tirar todo o beneficio que o framework nos traz. Simples não?

Abraços, 

Série Spring: Transaction via Annotation Spring 3 + Hibernate

Olá Pessoal,

No post de hoje veremos como usar Annotations nas nossas transaction. Para isso teremos como exemplo uma aplicação bem simples para irmos direto ao ponto.

Lets go…

 Starting…

Primeiro ponto é iniciarmos pelo arquivo de configuração do Spring. Antes disso,  vou assumir que você tem os .jars necessário: mysql 5, hibernate 3.x, spring 3.x, aop, aspectJ.

Esse é o projeto:

springannotationtransactionproject

Configurando o Spring

A seguir segue a configuração do Spring, aproveitei e coloquei o comentário in line para facilitar o entendimento:

Cabeçalho

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=“http://www.springframework.org/schema/context”

xmlns:tx=“http://www.springframework.org/schema/tx”

xsi:schemaLocation=“http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd”>

 

E o restante:

<context:component-scan base-package=“*”/>

<!– declarando a transation por default busca pelo id transactionManager –>

<tx:annotation-driven/> 

<!– faz o translate das exception para Spring Exception –>

<bean class=“org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor”/> 

<bean id=“transactionManager” class=“org.springframework.orm.hibernate3.HibernateTransactionManager”>

<property name=“sessionFactory” ref=“sessionFactory”/>

</bean>

 

<!– criando meu datasource –>

<bean id=“dataSource” class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>

<property name=“driverClassName” value=“com.mysql.jdbc.Driver”/>

<property name=“url” value=“jdbc:mysql://localhost/test”/>

<property name=“username” value=“root”/>

<property name=“password” value=“camilo2593”/>

</bean> 

<!– configurando o sessionFactory  –>

<bean id=“sessionFactory” class=“org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

<property name=“dataSource” ref=“dataSource”/>

<!– informando o package onde estão os beans annotated –>

<property name=“packagesToScan” value=“br.com.camilolopes.model.bean”/>

<!– aqui o Hibernate properties –>

<property name=“hibernateProperties”>

      <props>

      <prop key=“hibernate.dialect”>org.hibernate.dialect.MySQL5InnoDBDialect</prop>

      <prop key=“hibernate.hbm2ddl.auto”>update</prop>

      </props>

</property>

</bean>

</beans>

 

Onde está o segredo?

Exatamente nessa linha:

<!– declarando a transation por default busca pelo id transactionManager –>

<tx:annotation-driven/>

Pronto essa linha habilita reconhecer annotation @Transactional. Que faremos logo a seguir

Desenvolvendo

Vamos meter mão na massa na parte Java:

Entidade

@Entity

public class ProductTech implements Serializable{

      private static final long serialVersionUID = -206121128264026525L;

      @Id

      @GeneratedValue

      private Long id;

      private String nameProduct;

                //getters/setters omitidos

 

Interface DAO

public interface ProductDAO {

      void save(ProductTech product);

}

 

Implementação da Interface 

@Repository

public class ProductDAOImpl implements ProductDAO {

      private SessionFactory sessionFactory;

      @Autowired

      public ProductDAOImpl(SessionFactory sessionFactory) {

            this.sessionFactory = sessionFactory;

      }

      private Session currentSession(){

            return sessionFactory.getCurrentSession();

      } 

      @Override  //para execução deste método é requerido uma transação, é isso que estamos dizendo aqui

      @Transactional(propagation=Propagation.REQUIRED,readOnly=false)

      public void save(ProductTech product) {

            currentSession().save(product);

            System.out.println(“product saved with sucess”);

      }

}

Testando

E para testar vamos fazer dessa vez com uma classe que tem o método main, caso você ainda não esteja tão acostumado com unit test (deveria):

public class MainTestDAO {

      public static void main(String[] args) {

            ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“config/springconfiguration.xml”);

            ProductDAO bean = (ProductDAO) applicationContext.getBean(“productDAOImpl”);

            ProductTech product= new ProductTech();

            product.setNameProduct(“tablet samsung galaxy”);

            bean.save(product);

      }

}

Resultado:

springtransactionannotationresult

É isso ia. Simples e fácil usar anotações para transações no Spring.

Abracos! Vou ficando por aqui.

See ya!!!

Série Spring: Spring Aspect Object Programming – AOP

olá Pessoal,

O post de hoje veremos com brincar com AOP. Opsss… O que é isso? Veremos um pouco mais a seguir a utilidade de usar AOP e faremos um exemplo simples para vê-lo em ação.

lets go…

AOP – Aspect Object Programming

Em poucas palavras a orientação a aspectos surgiu para eliminar os chamados de cross cutting concerns, ou seja, aquele código que é necessário, mas que não faz parte das principais obrigações do objeto, por exemplo: logging, transação etc. E para isso precisamos entender trêsp ontos apenas:

 

1. Advice: separa o código nada ver em um lugar especifico

2. join point: define dentro do advice o momento que o código separado executa

3.point cuts: é onde será feito.

Então o advice é o que será feito. O joint cuts é quando será feito. E o point cuts é o onde será feito.

 

Antes de começarmos colocar mão na masa precisamos fazer download do .jar do AspectJ http://www.eclipse.org/aspectj/downloads.php após baixar, descompacte o .jar com o winrar por exemplo vá na pasta lib copie os .jars existentes e adicione ao seu projeto.

 

Precisamos também do AOP Alliance http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.org.aopalliance&version=1.0.0  faça o download e adicione ao seu projeto.

 

Adicione também o commons-logging-1.x http://commons.apache.org/logging/

 


AOPBankProject

Na diferente do que vimos no primeiro post. O objetivo de nossa aplicação é apenas logar informações quando um saque ou desposito for realizado. No exemplo logamos isso no console, em uma aplicação logariamos isso em arquivo de log por exemplo.

 

 

Desenvolvimento

 

1. crie o bean a seguir:

 

package br.com.camilolopes.bean;

import java.math.BigDecimal; 

public class Client  { 

                public void sacar(BigDecimal value) {

                               System.out.println(“Saque realizado com sucesso ” + value);

                }

                public void depositar(BigDecimal value) {

                               System.out.println(“Deposito realizado ” + value);

                }}

 

2. Agora vamos passar a resposabilidade para o Spring cuidar do nosso bean:

 

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans”

                xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

                xmlns:aop=”http://www.springframework.org/schema/aop”

                xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.2.xsd”>

<bean id=”client”  />

<bean class=”br.com.camilolopes.manager.ManagerTransationAccount”/>

<aop:aspectj-autoproxy />

</beans>

 

Há uma pequena mudança no nosso arquivo xml, observe que adicionamos ao cabeçalho xmlns e http referente aop. E em seguida criamos  um bean para cada classe. A ManagerTransationAccount ainda não criamos, mas não há problemas em colocarmos ela no xml. Vamos criar um pouco mais adiante. A tag de proxy que adicionamos acima estamos falando para o Spring fazer o trabalho duro de criar proxy para nós.

Agora vamos criar a nossa classe que vai controlar as mensagens, ou seja, tudo que acontece na conta será logado:

 

@Aspect

public class ManagerTransationAccount {

                @Pointcut(“execution(* *.sacar(..)”)

                public void transacao(){}               

                @Before(“transacao()”)

                public void saque(){

//                           poderia logar a info no arquivo de log

                               System.out.println(“Transação de saque inicializada”);

                }

                @AfterReturning(“transacao()”)

                public void retirada(){

                               System.out.println(“Transação de saque concluida com sucesso”);

                }

               

                @Pointcut(“execution(* *.depositar(..))”)

                public void deposito(){}

               

                @Before(“deposito()”)

                public void depositar(){

                               System.out.println(“Transação de deposito iniciada”);

                }

               

                @AfterReturning(“deposito()”)

                public void depositado(){

                               System.out.println(“deposito realizado com sucesso”);

                }

}

 

Explicando:

Bem, anotação na classe é bem intuitiva certo? é preciso dizer que essa classe é orientada a aspect. Dai por isso anotação no inicio dela. Em seguida criamos um método da classe onde tudo começa o segredo está na anotação. Observe que é um pointcut, ou seja, onde será feito o trabalho e ali estamos dizendo que será feito quando o método sacar for chamado de qualquer classe passando qualquer parametro.

 

Atenção: Nenhum método criado nessa classe tem relação com os métodos que criamos na interface Machine. Poderiamos aqui chamar nosso método de qualquer coisa. O segundo que criamos e chamamos de saque que leva anotação @Before diz o seguinte: antes de chamar transacao(), ou seja, o métod que tem o pointcut, execute este aqui, ou seja, vai imprimir no console uma mensagem. Mas, poderiamos gravar uma informação no arquivo de log.

As demais anotações falam por si só.

 

Agora vamos testar, crie uma classe com método main:

public class MainBankMachine {

                public static void main(String[] args) {

                               ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“conf/springconfiguration.xml”);

                               Client bean = (Client) applicationContext.getBean(“client”);

                               bean.sacar(BigDecimal.TEN);

                              

                }

}

 

O resultado

 

 aopresult

Agora fazendo deposito e saque:

 

aopresult2

      public static void main(String[] args) {

            ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“conf/springconfiguration.xml”);

            Client bean = (Client) applicationContext.getBean(“client”);

            bean.sacar(BigDecimal.TEN);

            bean.depositar(BigDecimal.ONE);

      }

bom, é isso. Bem mais simples e fácil de dar manutenção não?

Vou ficando por aqui espero que tenham gostado do post.

abracos, see ya!!!

Série Spring:Spring 3 com Hibernate 3.x

Olá Pessoal,

No post de hoje, veremos como integrar Spring com Hibernate. Ou seja, como podemos deixar tudo ao comando do Spring?  Deixar ele abrir ,fechar, commit , dar roll back nas transações? Diretamente o Spring não faz isso, mas ele delega para um cara que pode fazer isso. A moral da história que ao invés de nós programadores ter que dar beginTransaction, isso serrá feito nos bastidores. No exemplo a seguir fazeremos apenas um insert no banco de dados.

Lets go…

 

Requisitos

Antes de mais nada certifique que vc tem os .jars baixados:

  • – Mysql 5 .x
  • – Hibernate 3.6
  • – Spring 3.x
  • – AOP 1.x
  • – AspectJ
  • – commons-logging 1.x

Depois de garantir que você tem todos os .jars mãos na massa agora.

Starting…

Primeiro passo é que nosso exemplo será um Java Application, o objetivo é fazer a integração de maneira mais simples e funcional possível. Então crie seu Java Project e deixe conforme a imagem a seguir:

springwithhibernateproject

No final teremos os seguintes packages e classes:

 springhibernatepackages

Por onde começar?

Eu gosto sempre de iniciar pela parte de configuração, assim quando vou começar o desenvolvimento não preciso voltar para configurar, exceto quando é algo bem pontual. Então, iniciaremos pelo arquivo de configuração do Spring, no package config, crie um springconfiguration.xml.

Vou colocar o arquivo por partes e explicando, além disso coloquei uns comentários no .xml para facilitar o entendimento:

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=“http://www.springframework.org/schema/context”

xmlns:tx=“http://www.springframework.org/schema/tx”

xsi:schemaLocation=“http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd”>

 

Se vc vem acompanhando os outros posts e já conhece o básico do Spring deve conhecer o beans. A única coisa de novo que adicionamos aqui foi o xmlns tx para as transaction, que veremos mais na frente a sua importância. Portanto deixe seu beans conforme o código acima.

<!– buscando os beans –>

<context:component-scan base-package=“*” />

<!– transaction via annotations –>

<tx:annotation-driven />

<!– Translate exception –>

<bean class=“org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor”/>

 Aqui  temos um cara novo que é o PersistenceExceptionTransalationPostProcessor que é responsável por  “traduzir” as exceções checked em unchecked do Spring, assim não precisamos ficar tratando na nossa application.  Habilitamos que as transaction serão via annotation, ou seja, o Spring vai procurar pela annotation @Transaction. E também informamos que todo bean do Spring será via annotation e base de package colocamos todos.

DataSource

Agora precisamos criar um DataSource assim vamos dizer a que banco estaremos conectado em qual url e com o usuário xxxx, com a senha yyyyy.

<bean id=“dataSource” class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>

<property name=“driverClassName” value=“com.mysql.jdbc.Driver”/>

<property name=“url” value=“jdbc:mysql://localhost/test”/>

<property name=“username” value=“root”/>

<property name=“password” value=“bahia”/>

</bean>

 SessionFactory

Agora precisamos configurar nossa  sessionFactory, nesse caso estamos dizendo que vamos usar annotation  para persistência. Lembra que fazíamos isso diretamente no Hibernate na hora de criar a sessionFactory (new annotationXXX)?  Aqui há alguns pontos importantes:

<bean id=“sessionFactory” class=“org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

<!– informando o datasource, de onde vem a conexão? –>

<property name=“dataSource” ref=“dataSource”/>

<!– onde estão as classes com annotation? informando aqui –>

<property name=“packagesToScan” value=“br.com.camilolopes.model.bean”/>

<!– as configs do ormhibernate –>

<property name=“hibernateProperties”>

      <props>

<prop key=“hibernate.dialect”>org.hibernate.dialect.MySQL5InnoDBDialect”</prop>

      <prop key=“hibernate.hbm2ddl.auto”>update</prop>

      </props>

</property>

</bean>

 

Agora precisamos criar o cara que vai gerenciar as transaction no nosso caso como estamos usando o Hibernate será o HibernateTransactionManager:

<!–  esse é o cara que gerencia as transactions –>

<bean id=“transactionManager” class=“org.springframework.orm.hibernate3.HibernateTransactionManager”>

<property name=“sessionFactory” ref=“sessionFactory”/>

</bean>

 Pronto terminamos a parte de configuração. Vamos agora para parte Java

Development

No package dao. Criaremos uma interface. Nossa aplicação vai salvar um produto apenas.

public interface ProductDAO {

      void save(ProductTech product);

}

 Agora vem a classe que implementa a interface:

@Repository

public class ProductDAOImpl implements ProductDAO {

      private SessionFactory sessionFactory;

      @Autowired

      public ProductDAOImpl(SessionFactory sessionFactory) {

            this.sessionFactory = sessionFactory;

      }

      private Session currentSession(){

            return sessionFactory.getCurrentSession();

      }

       @Override  //para execução deste método é requerido uma transação, é isso que estamos dizendo aqui

      @Transactional(propagation=Propagation.REQUIRED,readOnly=false)

      public void save(ProductTech product) {

            currentSession().save(product);

            System.out.println(“product saved with sucess”);

      }

}

 

E a nossa entidade:

@Entity

public class ProductTech implements Serializable{

      @Id

      @GeneratedValue

      private Long id;

      private String nameProduct;

                //getters/setters ommitidos

 

Testando

Vamos criar uma classe com método main para testar:

public class MainTestDAO {

      public static void main(String[] args) {

            ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“config/springconfiguration.xml”);

            ProductDAO bean = (ProductDAO) applicationContext.getBean(“productDAOImpl”);

            ProductTech product= new ProductTech();

            product.setNameProduct(“tablet samsung galaxy”);

            bean.save(product);

      }

}

Antes de rodar garanta que o Banco está rodando.  Ao executar:

springhibernateresultado

Fácil não? Nos preocupamos mais com a parte de negócio, toda aquela parte chata de transação por exemplo está sendo cuidada nos bastidores.

Bom, vou ficando por aqui. E espero que tenham gostado do post.

Abraços see ya!! 

Série Spring: CRUD com Hibernate e Spring framework

olá Pessoal,

O post de hoje vamos fazer um CRUD usando Spring com Hibernate. Nós últimos posts vimos as coisas de forma separada para entendermos o funcionamento bem especifico. Vou considerar que leu nossos posts anteriores e aquilo que já foi explicado não estarei repetindo,para evitar que o post fique longo, apenas estarei ressaltando o que for importante e relevante para que você entenda.

Lets go..

O nosso Cenário

Será bem simples e funcional e o mais direto possível. O cenário é bem trivial uma livraria tem vários e um livro está para uma categoria, e em uma categoria pode ter vários livros.Dai vamos exercitar o relancionamento @OneToMany do hibernate e a integração do Hibernate com Spring. E para completar faremos a injeção de dependência usando Annotations.

 

Desenvolvimento

A seguir como ficará o nosso projeto

 springcrudbookproject

1. Crie um java project e os respectivos packages 

2. Adicione as bibliotecas do Spring Framework 3.x, Hibernate 3.x e MySql 5.x 

3. Crie a interface que terá o CRUD:

public interface BookStore {

                void saveOrUpdate(Book book);

                void delete(Book book);

                Book findById(Long id);

} 

4. Agora criaremos a classe que vai implementar a Interface:

@Repository

public class BookStoreDAO implements BookStore {               

                @Autowired

                private HibernateTemplate hibernateTemplate; 

                @Override

                public Book findById(Long id) {

                               return hibernateTemplate.get(Book.class, id);

                } 

                public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

                               this.hibernateTemplate = hibernateTemplate;

                } 

                public HibernateTemplate getHibernateTemplate() {

                               return hibernateTemplate;

                } 

                @Override

                public void saveOrUpdate(Book book) {

                               hibernateTemplate.saveOrUpdate(book);

                } 

                @Override

                public void delete(Book book) {

                               hibernateTemplate.delete(book);

                }}

 

 Até aqui nada de especial, exceto anotação @Autowired que colocamos para informar ao Spring que aquele atributo é dependecy injection que é controlado por ele. Quando criarmos o nosso arquivo de configuração do Spring vamos dizer para ele como olhar para as annotations. E anotação @Repository é para dizer ao Spring que essa classe é um DAO.

Agora vamos criar a classe CategoryDAO que vai persistir as categorias

@Repository

public class CategoryDAO {

                @Autowired

                private HibernateTemplate hibernateTemplate;               

                public void saveOrUpdate(Category category){

                               hibernateTemplate.saveOrUpdate(category);

                }}

Por enquanto essa classe não vai compilar, pq ainda não criamos a classe Category que criamos daqui a pouco, aguarde mais uns minutinhos. Bom,  até agora temos nossos DAOs prontos. Vamos criar nossos beans.

 

Book .java 

@Entity

public class Book implements Serializable{

                private static final long serialVersionUID = 888299914160143622L;               

                @Id

                @GeneratedValue

                private Long id;

                private Long isbn;

                private String title;

                private String author;

                @ManyToOne

                @JoinColumn(name=”category_id”)

                @Autowired

                private Category category;

//getters/setters omitidos

 

Category.java 

@Entity

public class Category implements Serializable { 

                private static final long serialVersionUID = 6469382724082923338L;

                @Id

                @GeneratedValue

                private Long id;

                private String categoryName;

                @OneToMany(mappedBy=”category”,targetEntity=Book.class,

fetch=FetchType.LAZY,cascade=CascadeType.ALL)

                @Autowired

                private List<Book> books = new ArrayList<Book>();

//getters/setters omitidos

 

Nada de especial aqui, apenas um relacionamento @OneToMany/@ManyToOne e o famoso @AutoWired que fará injeção de dependência.

 

Configurando o Spring 

1. Crie um arquivo xml e coloque no package conf,o meu chamei de springconfiguration.xml

 

O cabeçalho fica assim para dar suporte aos annotations: 

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd”>

 

Agora vamos criar os beans:

<!– beans  –>

 <bean  id=”category” class=”br.com.camilolopes.domain.classes.Category”/>

 <bean  id=”book”/>

 <bean  id=”bookstoredao” class=”br.com.camilolopes.dao.BookStoreDAO”/>

 <bean  id=”categorydao” class=”br.com.camilolopes.dao.CategoryDAO”/>

 

O dataSource, vou usar o MySql 

<!– DataSource –>

<bean id=”dataSource”>

                <property name=”driverClassName” value=”com.mysql.jdbc.Driver”/>

                <property name=”url” value=”jdbc:mysql://localhost/test”/>

                <property name=”username” value=”root”/>

                <property name=”password” value=”camilo2593″/>

</bean>

 <!– Using Annotations for mapping –>

 <bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

 <!– property for DataBase –>

                <property name=”dataSource” ref=”dataSource”/>

                <!– informing the annotated classes –>

                 <property name=”annotatedClasses”>

                <list>

                               <value>br.com.camilolopes.domain.classes.Book</value>

                               <value>br.com.camilolopes.domain.classes.Category</value>

                </list>

                </property>

                <!– Property of Hibernate –>

                <property name=”hibernateProperties”>

                               <props>

                               <prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>

                <prop key=”hibernate.show_sql”>true</prop>

                <prop key=”hibernate.hbm2ddl.auto”>update</prop>

                               </props>

                </property>

 </bean> 

 <!– using HibernateTemplate from Spring –>

 <bean  id=”hibernateTemplate” class=”org.springframework.orm.hibernate3.HibernateTemplate”>

                <property name=”sessionFactory” ref=”sessionFactory”/>

 </bean>

 

E definindo o uso de annotations para o Spring:

<context:annotation-config/>

E não esqueça de fechar o arquivo com:

</beans>

 

Agora criaremos uma classe com método main para realizar o CRUD: 

 

bdcrudspring

Esse é o nosso banco, com um cara já persistido: 

Crie a classe Main 

public class Main {

                public static void main(String[] args) {

//                           essa classe é o container

                               ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

                                                               “conf/springconfiguration.xml”);

                               BookStoreDAO bookStoreDAO = (BookStoreDAO) applicationContext.getBean(“bookstoredao”);

                               CategoryDAO categoryDAO = (CategoryDAO) applicationContext.getBean(“categorydao”);                              

//                           Book

                               Book book = new Book();

                               book.setAuthor(“Camilo Lopes”);

                               book.setIsbn(1235L);

                               book.setTitle(“Guia JEE c/ Frameworks”);                              

                               //Category

                               Category category = new Category();

                               category.getBooks().add(book);

                               category.setBooks(category.getBooks());

                               category.setCategoryName(“Development”);

                               book.setCategory(category );

//                           DAO

                                categoryDAO.saveOrUpdate(category);

                               bookStoreDAO.saveOrUpdate(book);                              

                               findBookById(bookStoreDAO, 1L);

                               deleteBook(bookStoreDAO,1L);

                }               

                private static void deleteBook(BookStoreDAO bookStoreDAO, long id) {

                               Book bookFound = bookStoreDAO.findById(id);

                               bookStoreDAO.delete(bookFound);

                               System.out.println(“Book deleted with sucess ” + bookFound.getTitle());                              

                }

                private static void findBookById(BookStoreDAO bookStoreDAO, Long id){

                               Book book = bookStoreDAO.findById(id);

                               System.out.println(“Title: “+ book.getTitle());

                               System.out.println(“Author: ” + book.getAuthor());

                }}

 

O código é bem simples somente para testarmos. Observe que salvamos um novo livro, em seguida buscamos o mesmo pelo Id e imprimos usando  o console do Java e depois deletamos o livro pelo Id.

Ao rodar teremos o resultado a seguir: 

resultcrudspring

Se formos no banco esperamos ter apenas o livro mais recente adicionado com o id igual 2 e o livro com o id = 1 deve ter sido deletado, com a imagem acima já vimos isso, pq temos o sql do hibernate habilitado, mas vamos ver na tabela do banco:

resultspringbd

 

resultcategoryspringbd

 

GitHub

Acesse o repositório no github com todos os projetos da série Spring:  https://github.com/camilolopes/workspacespring

Bom vou ficando por aqui, espero que tenham gostado do post.

abracos, see ya!!!