Aug 5, 2015

Spring JPA example with EntityManager,Hibernate,Spring,MySQL and Maven

Spring Data JPA API provides JpaTemplate class to integrate spring application with JPA.
 
JPA (Java Persistent API) is the sun specification for persisting objects in the enterprise application.
 
It is currently used as the replacement for complex entity beans.
 
The implementation of JPA specification are provided by many vendors such as:
 
* Hibernate
* Toplink
* iBatis
* OpenJPA etc.

 
In the post I am going to provide an example of application which will demonstrate Spring Data (JPA) in conjunction with Spring IoC, MySQL and Maven. Hibernate will be used as implementation of the JPA.

Application Structure




1. Create a Maven Project
 
Create a Maven project with below dependencies. (pom.xml)


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>SpringDataJPA</groupId>
 <artifactId>SpringDataJPA</artifactId>
 <version>1.0-SNAPSHOT</version>
 <properties>
  <spring.version>4.0.0.RELEASE</spring.version>
  <mysql.version>5.1.27</mysql.version>
  <hibernate-entitymanager.version>4.2.8.Final</hibernate-entitymanager.version>
 </properties>
 <dependencies>
  <dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.2</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
   <version>1.8.0.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-core</artifactId>
   <version>${spring.version}</version>
   <exclusions>
    <exclusion>
     <groupId>org.springframework</groupId>
     <artifactId>spring-asm</artifactId>
    </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-expression</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aop</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-entitymanager</artifactId>
   <version>${hibernate-entitymanager.version}</version>
  </dependency>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>${mysql.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${spring.version}</version>
  </dependency>
 </dependencies>
</project>



  2. Create a Pojo class (Employee.java)

package com.nadhu.spring.jpa.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * Created by Nadhamuni Kothapalle
 */
@Entity
@Table(name = "Employee")
public class Employee {
    @Id
    @Column(name = "id")
    private int id;
    @Column(name = "fistName")
    private String firstName;
    @Column(name = "lastName")
    private String lastName;
    @Column(name = "dept")
    private String dept;
    public Employee() {
    }
    public Employee(int id, String firstName, String lastName, String dept) {
        this.setId(id);
        this.setFirstName(firstName);
        this.setLastName(lastName);
        this.setDept(dept);
    }
    public int getId() {
        return id;
    }
    public void setId(int 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 getDept() {
        return dept;
    }
    public void setDept(String dept) {
        this.dept = dept;
    }
}

3. Create EmployeeRepository interface (EmployeeRepository.java)

package com.nadhu.spring.jpa.repo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.nadhu.spring.jpa.entity.Employee;
/**
 * Created by Nadhamuni Kothapalle
 */
@Repository
public interface EmployeeRepository extends CrudRepository {
 public Employee findByid(Integer id);
}


4. Create EmployeeService interface (EmployeeService.java)

package com.nadhu.spring.ser.api;
import com.nadhu.spring.jpa.entity.Employee;
/**
 * Created by Nadhamuni Kothapalle
 */
public interface EmployeeService {
 public void saveEmployee(Employee empObj);
 public Employee showEmployee(Integer id);
}

5. Create EmployeeServiceImpl class  (EmployeeServiceImpl.java)

package com.nadhu.spring.ser.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.nadhu.spring.jpa.entity.Employee;
import com.nadhu.spring.jpa.repo.EmployeeRepository;
import com.nadhu.spring.ser.api.EmployeeService;
/**
 * Created by Nadhamuni Kothapalle
 */
@Component
public class EmployeeServiceImpl implements EmployeeService{
 @Autowired
 private EmployeeRepository employeeRepository;
 @Override
 public void saveEmployee(Employee empObj) {    
  // TODO Auto-generated method stub
  employeeRepository.save(empObj);
 }
 @Override
 public Employee showEmployee(Integer id) {
  return employeeRepository.findByid(id);
 }
}

6. spring-config.xml



<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
 xmlns:jpa="http://www.springframework.org/schema/data/jpa"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://www.springframework.org/schema/data/jpa 
 http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
 http://www.springframework.org/schema/context  
 http://www.springframework.org/schema/context/spring-context-3.2.xsd 
 http://www.springframework.org/schema/tx 
 http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

 <!-- For consider the using of annotations foe defining Spring Bean -->
 <context:annotation-config />
 <!-- For bootstrapping the Spring Repository -->
 <jpa:repositories base-package="com.nadhu.spring.jpa.repo" />
 <!-- For defining Spring Bean -->
 <context:component-scan base-package="com.nadhu.spring.ser.impl" /> 

 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" />
  <property name="username" value="root" />
  <property name="password" value="knmuni" />
 </bean>

 <bean id="jpaVendorAdapter"
  class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  <property name="showSql" value="true" />
  <property name="generateDdl" value="true" />
  <property name="database" value="MYSQL" />
 </bean>

 <bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
  <!-- spring based scanning for entity classes -->
  <property name="packagesToScan" value="com.nadhu.spring.jpa.entity" />
 </bean>

 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
 <!-- <bean id="employeeService" class="com.nadhu.spring.ser.impl.EmployeeServiceImpl" /> -->

</beans>



7. Create EmployeeTest class  (EmployeeTest.java)

package com.nadhu.spring.java.exe;

import java.util.ArrayList;
import java.util.List;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.nadhu.spring.jpa.entity.Employee;
import com.nadhu.spring.ser.api.EmployeeService;
/**
 * Created by Nadhamuni Kothapalle
 */
public class EmployeeTest {
   

 private AbstractApplicationContext context;
 public static void main(String[] args) {

  EmployeeTest empTest = new EmployeeTest();
  empTest.createEmployee(99, "Nadhamuni", "Kothapalle", "MCA");
  empTest.displayEmployee(99);
 }
 private EmployeeService serviceObject() {
  context = new ClassPathXmlApplicationContext("spring-config.xml");
  //return setEmployeeService((EmployeeService) context.getBean("employeeService"));
  return (EmployeeService)context.getBean("employeeServiceImpl");

 }
 private void createEmployee(int id, String firstName, String lastName,String dept) {
  Employee empObj = new Employee(id, firstName, lastName, dept);
  serviceObject().saveEmployee(empObj);
  context.close();
 }
 private void displayEmployee(int id) {
  List list = new ArrayList();
  list.add(serviceObject().showEmployee(id));
  context.close();
  for (Employee el : list) {
   System.out.println(el.getFirstName());
   System.out.println(el.getLastName());
   System.out.println(el.getDept());
  }
 }

}




No comments: