spring capitulo 04

29

Upload: diego-pacheco

Post on 18-May-2015

5.582 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Spring Capitulo 04
Page 2: Spring Capitulo 04
Page 3: Spring Capitulo 04

Conhecer a árvore hierárquica de Exceptions do Spring

Saber criar um DataSource Conhecer as principais

funcionalidades do JdbcTemplate Saber utilizar o

SessionFactoryBean Conhecer as principais

funcionalidades do HibernateTemplate

Page 4: Spring Capitulo 04

Saber utilizar transações declarativas

Page 5: Spring Capitulo 04

Exceptions do Spring Unchecked Tradução de SQLException para

uma mais específica. JDO, JPA, Hibernate e JDBC estão na

mesma árvore de exeptions Facilidade para trocar o mecanismo

de persistência *DaoSupport

Page 6: Spring Capitulo 04

JdbcDaoSupport: Super classe para acesso via JDBC, necessita um DataSource, prove um instância de JDBCTemplate.

HibernateDaoSupport: Super classe de acesso via Hibernate, necessita uma SessionFactory, prove uma instância de HibernateTemplate.

JdoDaoSupport: Super classe de acesso via JDO, necessita uma PersistenceManagerFactory, prove uma instância de JdoTemplate.

JpaDaoSupport : Super classe de acesso via JDO, necessita uma EntityManagerFactory, prove uma instância de JpaTemplate.

Page 7: Spring Capitulo 04
Page 8: Spring Capitulo 04

– Parte da Especificação Jdbc– Permite “esconder” problemas de:

– Gerenciamento transacional– Pools de conexões– Pode se usar uma fonte JNDI– DriverManagerDataSource:–Simples–Genérica –Não tem pool

Page 9: Spring Capitulo 04

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource” class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false" > <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:hsql://C:/db" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean></beans>

Page 10: Spring Capitulo 04

– Template Jdbc– Métodos utilitários– Orientado a DataSource– Tem suporte ao certo nível de “orm”– Query com retornos refinados– Callbacks

Page 11: Spring Capitulo 04

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false" > <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url” value="jdbc:hsqldb:file:///C:\\target\\spring\\db" /> <property name="username" value="sa" /> <property name="password“ value="" /> </bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" lazy-init="false" > <property name="dataSource" ref="dataSource" /> <property name="lazyInit" value="false" /> </bean>

</beans>

Page 12: Spring Capitulo 04

– Execute (String sql)– Update (String sql,Object[] args)– queryForObject (String sql,Class requiredType)– queryForObject (String sql,RowMapper rowMapper)– queryForInt (String sql)– queryForList (String sql)

Page 13: Spring Capitulo 04

– Bean para gerenciar SessionFactory do Hibernate

– LocalSessionFactoryBean– DataSource– Hibernate mappings (via Spring)– Muito utilizado em aplicações JEE

Page 14: Spring Capitulo 04

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource” lazy-init="false" > <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:file:///C:\\target\\spring\\db" /> <property name="username" value="sa" /> <property name="password" value="" /></bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="false" > <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list>

<value>com/targettrust/spring/hibernate/Pessoa.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props>

<prop key="hibernate.dialect"> org.hibernate.dialect.PointbaseDialect </prop>

<prop key="hibernate.hbm2ddl.auto">create</prop> </props> </property> </bean></beans>

Page 15: Spring Capitulo 04

– Dependências (jars):– Hibernate3.jar– jta.jar– dom4j-1.6.1.jar– commons-logging.jar– commons-collections.jar– antlr-2.7.6.jar– mais Driver jdbc do Banco

Page 16: Spring Capitulo 04

– Template para o Hibernate– Necessita uma SessionFactory– Abre e Fecha SS – Participa de transações– Algums métodos:

– Find (String hql)– findByCriteria (DetachedCriteria

d)– Delete (String hql)– saveOrUpdate– get

Page 17: Spring Capitulo 04

– Callbacks para acessar a SessionFactory do Hibernate, porém com as facilidades de:– Abrir SS– Fechar SS– HibernateCallBack: execute

Page 18: Spring Capitulo 04

package com.targettrust.spring.hibernate;public class Pessoa {

private Long id;private String nome;private String email;

// Getters e Setters}

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping> <class name="com.targettrust.spring.hibernate.Pessoa" table="pessoa"> <id name="id" column="id" type="java.lang.Long" unsaved-value="0"> <generator class="increment"/> </id> <property name="nome" column="nome" type="java.lang.String"/> <property name="email" column="email" type="java.lang.String"/> </class></hibernate-mapping>

Page 19: Spring Capitulo 04

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource” lazy-init="false” class="org.springframework.jdbc.datasource.DriverManagerDataSource“ > <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:file:///C:\\target\\spring\\db" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean> <bean id="sessionFactory“ lazy-init="false" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean“ > <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list><value>com/targettrust/spring/hibernate/Pessoa.hbm.xml</value></list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.PointbaseDialect</prop> </props> </property> </bean> <bean id="hibernateTemplate“ lazy-init="false” class="org.springframework.orm.hibernate3.HibernateTemplate“ > <property name="sessionFactory" ref="sessionFactory" /> </bean>

</beans>

Page 20: Spring Capitulo 04

– Recurso disponivel apenas em containers JEE

– Gerenciamento transacional declarativo para Jdbc( EJB não tem !!! )

– TransactionManager: HibernateTransacrtionManager

– Interceptor AOP Proxy– Transação: Session Factory

ThreadLocal(HibernateTransactionManager), mudar para JPA(transação Distribuída) sem mexer no código.

Page 21: Spring Capitulo 04

– Abstração de Commit/Rollback – AutomaticosCommit/Rollback

baseado em exceptions:– Se nenhuma exception

unchecked é levantada: commit– Se alguma exception unchecked

é levantada por quem tem o proxy de transação: rollback

Page 22: Spring Capitulo 04

– Compatibilidade com modelo antigo Spring 1.x.x: TransactionProxyFactoryBean

– HibernateTransactionManager:– Expõe por DataSource– Mesma transação Entre:

– JDBC e Hibernate– De forma declarativa

Page 23: Spring Capitulo 04

Passos para criação:– DataSource– SessionFactoryBean– HibernateTransactionManager– AOP Config– TxAdvice

Page 24: Spring Capitulo 04

<!-- Definição do Dataource para acesso ao banco HSQLDB --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false"><property name="driverClassName" value="org.hsqldb.jdbcDriver" /><property name="url" value="jdbc:hsqldb:file:///C:\\target\\spring\\db" /><property name="username" value="sa" /><property name="password" value="" /></bean>

Page 25: Spring Capitulo 04

<!-- Definição da SessionFactory do Hibernate --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="false"> <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list> <value>com/targettrust/spring/transaction/Produto.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </prop> </props></property></bean>

Page 26: Spring Capitulo 04

<!-- Definição do TransactionManager, nesse caso o escolhido para a tarefa de gerencia as transações foi o

org.springframework.orm.hibernate3.HibernateTransactionManager que gerencia transações entre Hibernate e JDBC pelo DataSource -->

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

Page 27: Spring Capitulo 04

define os pontos do sistema que seram interceptados, nesse caso é a execução de qaulquer metodos do ProdutoService. Depois ele vincula essas classes interceptadas com um advice o txAdvice; --><aop:config><aop:pointcut id="produtoServiceMetodos" expression="execution(* com.targettrust.spring.transaction.ProdutoService.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="produtoServiceMetodos" /></aop:config>

Page 28: Spring Capitulo 04

<!-- Definição do Advide AOP que casa o gerente de transações com os metodos Esse beans informa que metodos e como esses metodos devemser tratados pela transação --><tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="salvar*" propagation="REQUIRED" /> <tx:method name="findAll" propagation="REQUIRED" read-only="true"/></tx:attributes></tx:advice>

Page 29: Spring Capitulo 04

1. Crei um Data Source para o banco de dados HSQLDB2. Defina um Bean JDBCTemplate3. Utilize o método queryForObject e liste todos os produtos4. Faça um DAO que grave produtos utilizando transações declarativas e

caso o produto a ser gravado tenha valor <= 0 levante uma exception para invalidar a operação após o save.