Back-End

7 ago, 2013

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

Publicidade

Spring

Olá, pessoal.

No artigo 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ários: mysql 5, hibernate 3.x, spring 3.x, aop, aspectJ.

Este é o projeto:

spring-1

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

[xml]

<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”>

[/xml]

E o restante:

[xml]

<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>

[/xml]

Criando meu datasource:

[xml]

<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>

[/xml]

Configurando o sessionFactory:

[xml]

<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>

[/xml]

Onde está o segredo?

Exatamente nessa linha:

[java]

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

<tx:annotation-driven/>

[/java]

Pronto. Essa linha habilita reconhecer annotation @Transactional, que faremos logo a seguir.

Desenvolvendo

Vamos meter mão na massa na parte Java:

Entidade

[java]

@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);

}

[/java]

Implementação da Interface

[java]

@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”);

}

}

[/java]

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):

[java]

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);

}

}

[/java]

Resultado

spring-2

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

Abraços! Vou ficando por aqui.

See ya!!!