Um Guia para JPA com Spring
1. Visão geral
Este tutorialshows how to set up Spring with JPA, usando o Hibernate como um provedor de persistência.
Para obter uma introdução passo a passo sobre como configurar o contexto Spring usando a configuração baseada em Java e o Maven pom básico para o projeto, consultethis article.
Começaremos configurando o JPA em um projeto Spring Boot e, em seguida, veremos a configuração completa necessária se tivermos um projeto Spring padrão.
Leitura adicional:
Definindo entidades JPA
Aprenda a definir entidades e personalizá-las usando a Java Persistence API.
Inicialização de mola com hibernação
Uma introdução rápida e prática à integração do Spring Boot e do Hibernate / JPA.
NEW: Aqui está um vídeo sobre como configurar o Hibernate 4 com Spring 4 (eu recomendo assistir em 1080p completo):
[.iframe-fluido] ##
2. JPA no Spring Boot
O projeto Spring Boot visa tornar a criação de aplicativos Spring muito mais rápida e fácil. Isso é feito com o uso de iniciantes e a configuração automática para várias funcionalidades do Spring, entre elas a JPA.
2.1. Dependências do Maven
Para habilitar o JPA em um aplicativo Spring Boot, precisamos das dependênciasspring-boot-starterespring-boot-starter-data-jpa:
org.springframework.boot
spring-boot-starter
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-data-jpa
2.1.4.RELEASE
Ospring-boot-starter contém a configuração automática necessária para Spring JPA. Além disso, o projetospring-boot-starter-jpa faz referência a todas as dependências necessárias, comohibernate-entitymanager.
2.2. Configuração
Spring Boot configures Hibernate as the default JPA provider, então não é mais necessário definir o beanentityManagerFactory, a menos que queiramos personalizá-lo.
Spring Boot can also auto-configure the dataSource bean, depending on the database we’re using. No caso de um banco de dados na memória do tipoH2,HSQLDBeApache Derby, o Boot configura automaticamenteDataSource se a dependência do banco de dados correspondente estiver presente no caminho de classe.
Por exemplo, se quisermos usar um banco de dadosH2 na memória em um aplicativo Spring Boot JPA, só precisamos adicionar a dependênciah2 ao arquivopom.xml:
com.h2database
h2
1.4.197
Dessa forma, não precisamos definir o beandataSource, mas podemos fazer isso se quisermos personalizá-lo.
Se quisermos usar JPA com o banco de dadosMySQL, precisamos da dependênciamysql-connector-java, bem como definir a configuraçãoDataSource.
Podemos fazer isso em uma classe@Configuration ou usando as propriedades padrão do Spring Boot.
A configuração do Java tem a mesma aparência de um projeto Spring padrão:
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("mysqluser");
dataSource.setPassword("mysqlpass");
dataSource.setUrl(
"jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true");
return dataSource;
}
Para configurar a fonte de dados usando um arquivo de propriedades, temos que definir as propriedades prefixadas comspring.datasource:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=mysqluser
spring.datasource.password=mysqlpass
spring.datasource.url=
jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
O Spring Boot configurará automaticamente uma fonte de dados com base nessas propriedades.
Também no Spring Boot 1, o pool de conexão padrão eraTomcat, mas com Spring Boot 2 ele foi alterado paraHikariCP.
Você pode encontrar mais exemplos de configuração de JPA no Spring Boot emGitHub project.
Como podemos ver, a configuração básica do JPA é bastante simples se estivermos usando o Spring Boot.
No entanto,if we have a standard Spring project, then we need more explicit configuration, using either Java or XML. É nisso que nos concentraremos nas próximas seções.
3. A configuração JPA Spring com Java - em um projeto não inicializável
Para usar JPA em um projeto Spring,we need to set up the EntityManager.
Esta é a parte principal da configuração e podemos fazê-lo através de um bean de fábrica do Spring. Pode ser oLocalEntityManagerFactoryBean mais simples outhe more flexible LocalContainerEntityManagerFactoryBean.
Vamos ver como podemos usar a última opção:
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.example.persistence.model" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
// ...
}
We also need to explicitly define the DataSource bean que usamos acima:
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
dataSource.setUsername( "tutorialuser" );
dataSource.setPassword( "tutorialmy5ql" );
return dataSource;
}
A parte final da configuração são as propriedades adicionais do Hibernate e os beansTransactionManagereexceptionTranslation:
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
4. A configuração JPA Spring com XML
A seguir, vamos ver a mesma configuração Spring com XML:
create-drop
org.hibernate.dialect.MySQL5Dialect
Há uma diferença relativamente pequena entre o XML e a nova configuração baseada em Java. Ou seja, em XML, uma referência a outro bean pode apontar para o bean ou uma fábrica de beans para esse bean.
Em Java, entretanto, como os tipos são diferentes, o compilador não permite isso e, portanto, oEntityManagerFactory é primeiro recuperado de sua fábrica de feijão e, em seguida, passado para o gerenciador de transações:
txManager.setEntityManagerFactory(this.entityManagerFactoryBean().getObject());
5. Tornando-se totalmente sem XML
Normalmente, o JPA define uma unidade de persistência por meio do arquivoMETA-INF/persistence.xml. Starting with Spring 3.1, the persistence.xml is no longer necessary. OLocalContainerEntityManagerFactoryBean agora suporta uma propriedade‘packagesToScan' onde os pacotes para varrer as classes@Entity podem ser especificados.
Este arquivo foi o último pedaço de XML que precisamos remover. We can now set up JPA fully with no XML.
Normalmente, especificaríamos as propriedades JPA no arquivopersistence.xml. Como alternativa, podemos adicionar as propriedades diretamente ao bean de fábrica do gerenciador de entidades:
factoryBean.setJpaProperties(this.additionalProperties());
Como uma observação lateral, se o Hibernate for o provedor de persistência, essa seria a maneira de especificar propriedades específicas do Hibernate.
6. A configuração Maven
Além do Spring Core e dependências de persistência - mostradas em detalhes noSpring with Maven tutorial - também precisamos definir JPA e Hibernate no projeto, bem como um conector MySQL:
org.hibernate
hibernate-entitymanager
5.4.2.Final
runtime
mysql
mysql-connector-java
6.0.6
runtime
Observe que a dependência do MySQL está incluída como um exemplo. Precisamos de um driver para configurar a fonte de dados, mas qualquerHibernate supported database servirá.
7. Conclusão
Este tutorial ilustrou como configurarJPA with Hibernate in Spring em um Spring Boot e um aplicativo Spring padrão.
Como sempre, o código apresentado neste artigo está disponívelover on Github.