Сейчас, интеграция Spring и JPA стало прстым и понятным благодаря Spring boot и Spring Data. Рассмотрим его. Так же используем Docker. Начнем с него.
Настроим PostgresSql:
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
Создадим таблицу работников (Employees)
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);
Далее gradle-файл
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");
}
Обратите внимание, мы добавили пул соединений с3p0, spring-boot-starter-data-jpa для Hibernate и драйвер для Postgress. Это все, что нам нужно.
Класс Application:
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);
}
}
Конфигурация Datasource:
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;
}
}
Конфигурация JPA:
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;
}
}
Наша сущность для таблицы работников
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;
}
}
Репозиторий, который поможет нам выбрать всех работников
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И сам контроллер,который будет получать данные{ }
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 getTest() {
return employeeRepository.findAll();
}
}
Очень удобно, все зависимости и другие xml-конфигурации остались в прошлом.Весь код можно найти здесь
PS это мой перевод данной статьи.
Комментариев нет :
Отправить комментарий