Enterprise Java
Spring boot and Spring data JPA integration
Nowadays spring and JPA integration has become a piece of cake thanks to Spring Boot and spring Data.
I am gonna setup a postgresql server
docker pull postgres #run the container docker run --name postgreslocal -e POSTGRES_PASSWORD=postgres -d postgres #get the ip docker inspect --format '{{ .NetworkSettings.IPAddress }}' postgreslocal #get the port docker inspect --format '{{ .NetworkSettings.Ports }}' postgreslocal
Create the employees Table
create schema spring_data_jpa_example; create table spring_data_jpa_example.employee( id SERIAL PRIMARY KEY, firstname TEXT NOT NULL, lastname TEXT NOT NULL, email TEXT not null, age INT NOT NULL, salary real, unique(email) ); insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary) values ('Emmanouil','Gkatziouras','gkatzioura@gmail.com',18,3000.23);
Let’s begin with our gradle file
group 'com.gkatzioura' version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE") } } apply plugin: 'idea' apply plugin: 'spring-boot' repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") { exclude module: "spring-boot-starter-tomcat" } compile("org.postgresql:postgresql:9.4-1206-jdbc42") compile("org.springframework.boot:spring-boot-starter-jetty") compile("org.springframework.boot:spring-boot-starter-data-jpa:1.3.3.RELEASE") compile("com.mchange:c3p0:0.9.5.2") testCompile("junit:junit:4.11"); }
As you see we added the c3p0 connection pool, the spring-boot-starter-data-jpa for hibernate and the postgres driver. That’s all we need.
The Application class
package com.gkatzioura.springdata.jpa; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; /** * Created by gkatzioura on 6/2/16. */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(); ApplicationContext ctx = springApplication.run(Application.class, args); } }
The DataSource configuration
package com.gkatzioura.springdata.jpa.config; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * Created by gkatzioura on 6/2/16. */ @Configuration public class DataSourceConfig { @Bean public DataSource createDataSource() throws Exception { ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setJdbcUrl("jdbc:postgresql://172.17.0.3:5432/postgres?user=postgres&password=postgres"); ds.setDriverClass("org.postgresql.Driver"); return ds; } }
The Jpa Configuration
package com.gkatzioura.springdata.jpa.config; import org.hibernate.jpa.HibernatePersistenceProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.util.Properties; /** * Created by gkatzioura on 6/2/16. */ @Configuration @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager", basePackages = {"com.gkatzioura.springdata.jpa.persistence"}) @EnableTransactionManagement public class JPAConfig { @Autowired private DataSource dataSource; @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setDataSource(dataSource); entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); entityManagerFactoryBean.setJpaProperties(hibernateProperties()); entityManagerFactoryBean.setPackagesToScan(new String[] {"com.gkatzioura.springdata.jpa.persistence"}); return entityManagerFactoryBean; } @Bean public JpaTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } private Properties hibernateProperties() { Properties properties = new Properties(); properties.put("hibernate.dialect","org.hibernate.dialect.PostgreSQL9Dialect"); properties.put("hibernate.globally_quoted_identifiers","true"); return properties; } }
Our entity for the table employee
package com.gkatzioura.springdata.jpa.persistence.entity; import javax.persistence.*; /** * Created by gkatzioura on 6/2/16. */ @Entity @Table(name = "employee", schema="spring_data_jpa_example") public class Employee { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; @Column(name = "firstname") private String firstName; @Column(name = "lastname") private String lastname; @Column(name = "email") private String email; @Column(name = "age") private Integer age; @Column(name = "salary") private Integer salary; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getSalary() { return salary; } public void setSalary(Integer salary) { this.salary = salary; } }
The repository that will help us access all users
package com.gkatzioura.springdata.jpa.persistence.repository; import com.gkatzioura.springdata.jpa.persistence.entity.Employee; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * Created by gkatzioura on 6/2/16. */ @Repository public interface EmployeeRepository extends JpaRepository<Employee,Long>{ }
And a controller that will fetch all the data
package com.gkatzioura.springdata.jpa.controller; import com.gkatzioura.springdata.jpa.persistence.entity.Employee; import com.gkatzioura.springdata.jpa.persistence.repository.EmployeeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * Created by gkatzioura on 6/2/16. */ @RestController public class TestController { @Autowired private EmployeeRepository employeeRepository; @RequestMapping("/employee") public List<Employee> getTest() { return employeeRepository.findAll(); } }
Pretty convenient considering the dependencies and the xml configuration overhead of the past.
You can find the source code on github .
Reference: | Spring boot and Spring data JPA integration from our JCG partner Emmanouil Gkatziouras at the gkatzioura blog. |