Spring MVC com Annotations – Configurando a Camada de Persistência

Olá galera, tudo bem?

Em meu último post, expliquei como configurar um projeto com Spring MVC sem utilização de xml. Utilizando este mesmo exemplo, neste post vou explicar como configurar a camada de persistência.

Por questão de organização de código, resolvi criar uma classe chamada PersistenceConfig.class e nela concentrar os beans relacionadas a persistência, nada impede que você utilize a classe de criação do contexto já existente no projeto para esta tarefa.

Nesta classe incluiremos duas anotações:

@Configuration utilizada para indicarmos ao Spring que existem beans a serem processados.

@EnableTransactionManagement que é utilizada para substituir a tag <tx:annotation-driven> onde dizemos para Spring para habilitar o gerenciamento de transações por anotações.

@Configuration
@EnableTransactionManagement
public class PersistenceConfig { }

Dando sequência, precisaremos declarar alguns beans nesta classe.

DataSource – Configuração para conexão com o banco de dados. Para este exemplo utilizamos uma base de dados em memória

@Bean
public DataSource dataSource() {
	DriverManagerDataSource dataSource = new DriverManagerDataSource();
	dataSource.setDriverClassName("org.h2.Driver");
	dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1");
	dataSource.setUsername("sa");
	dataSource.setPassword("sa");
	return dataSource;
}

JpaVendorApdater – Utilizada para conectar comportamentos específicos do ORM escolhido ao Spring, no nosso caso, Hibernate.

@Bean
public JpaVendorAdapter jpaVendorApapter() {
	return new HibernateJpaVendorAdapter();
}

EntityManagerFactory – Aqui representado pela classe LocalContainerEntityManagerFactoryBean que é uma forma poderosa criar e compartilhar um EntityManagerFactory no contexto do Spring possibilitando assim o uso de injeção de dependência.

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
	LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
	emf.setDataSource(dataSource());
	emf.setPackagesToScan("br.matera.model");
	emf.setJpaVendorAdapter(jpaVendorApapter());
	emf.setJpaProperties(jpaProperties());
	return emf;
}

private Properties jpaProperties() {
	Properties properties = new Properties();
	properties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
	properties.put("hibernate.show_sql", "true");
	properties.put("hibernate.hbm2ddl.auto", "create-drop");
	return properties;
}

TransactionManager – A interface PlatformTransactionManager é o objeto principal do estrutura de transacional do Spring.  Nós apenas iremos fornecer ao Spring nosso EntityManagerFactory e deixar que ele faça o resto.

@Bean
@Autowired
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManager){
	JpaTransactionManager transactionManager = new JpaTransactionManager();
	transactionManager.setEntityManagerFactory(entityManager);
	return transactionManager;
}

Em nosso contexto, precisamos apenas incluir o import para que as configurações de persistência sejam carregadas.

@EnableWebMvc
@Configuration
@Import(PersistenceConfig.class) // <-- Import da configuração de persistência
@ComponentScan(value = "br.springannotations.*")
public class Context { }

E com isso finalizamos nossas configurações. Simples não?

Fico por aqui e estou compartilhando o link do projeto no GitHub caso queiram ver mais detalhes.

Até a próxima.

 

Links

Mapeamento Objeto Relacional(ORM) – https://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional

Hibernate – https://pt.wikipedia.org/wiki/Hibernate

 

DEPENDÊNCIAS:

Por FERNANDO GODOI

Entusiasta Java, Professor universitário e apaixonado por música.

Postado em: 24 de outubro de 2016

Confira outros artigos do nosso blog

Inteligência Artificial: uma introdução ao Deep Learning

11 de setembro de 2018

Guilherme Moraes Armigliatto

Implementando Circuit Breaker com Spring Cloud Netflix

25 de julho de 2018

Jamila Peripolli Souza

Balanceamento de carga em microsserviços com Spring Cloud Netflix

13 de julho de 2018

Jamila Peripolli Souza

Quais os benefícios da arquitetura REST?

26 de junho de 2018

Henrique Lacerda

Deixe seu comentário