{"id":115,"date":"2016-09-13T10:30:00","date_gmt":"2016-09-13T10:30:00","guid":{"rendered":"http:\/\/www.java2blog.com\/?p=115"},"modified":"2021-01-11T17:55:52","modified_gmt":"2021-01-11T12:25:52","slug":"spring-data-jpa-example","status":"publish","type":"post","link":"https:\/\/java2blog.com\/spring-data-jpa-example\/","title":{"rendered":"Spring Data JPA example"},"content":{"rendered":"<div id=\"toc_container\" class=\"toc_light_blue no_bullets\"><p class=\"toc_title\">Table of Contents<\/p><ul class=\"toc_list\"><ul><li><a href=\"#Why_Spring_data_JPA\">Why Spring data JPA:<\/a><\/li><\/ul><\/li><li><a href=\"#Download_source_code\">Download source code:<\/a><\/li><\/ul><\/div>\n<div dir=\"ltr\" style=\"text-align: left;\">In this post, we are going to see about Spring data JPA.<br \/>\nSpring data JPA provides jpaTemplate to integrate Spring and JPA.<\/p>\n<h4 style=\"text-align: left;\"><span id=\"Why_Spring_data_JPA\">Why Spring data JPA:<\/span><\/h4>\n<p>It is quite cumbersome to implement data access layer now a day. You need to write too much boiler plate code to even execute simple queries and you have to write too much code before and after executing queries. Spring data JPA provides APIs which is quite abstract and you just need to write repository interface \u00a0and Spring data JPA will provide implementation automatically. You can also declare some custom find methods (findCountryByName) and spring will provide implementation for it.<\/p>\n<h3><span id=\"Download_source_code\">Download source code:<\/span><\/h3>\n<div><a href=\"https:\/\/github.com\/arpitmandliya\/SpringDataJPAHibernateExample\/archive\/master.zip\" target=\"_blank\" rel=\"noopener\">Download<\/a><\/div>\n<p><b>Lets understand more with the help of example:<\/b><br \/>\nCreate Country table in mysql database with following code:<\/p>\n<pre name=\"code\">CREATE TABLE COUNTRY\n(\n   id int PRIMARY KEY NOT NULL AUTO_INCREMENT,\n   countryName varchar(100) NOT NULL,\n   population int NOT NULL\n)\n;<\/pre>\n<p>We will you use Country table for querying and updating values in database.<br \/>\n<b>Step 1:<\/b><br \/>\nCreate a simple maven java project as &#8220;SpringDataJPAHibernateExample&#8221;.<br \/>\n<b>Step 2:<\/b><br \/>\nInclude Spring data, hibernate and mysql dependency in pom.xml.<\/p>\n<pre class=\"xml\" data-blogger-escaped-name=\"code\"><project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n <modelVersion>4.0.0<\/modelVersion>\n\n <groupId>org.arpit.java2blog<\/groupId>\n <artifactId>SpringDataJPAHibernateExample<\/artifactId>\n <version>0.0.1-SNAPSHOT<\/version>\n <packaging>jar<\/packaging>\n\n <name>SpringDataJPAHibernateExample<\/name>\n <url>http:\/\/maven.apache.org<\/url>\n\n <properties>\n  <project.build.sourceEncoding>UTF-8<\/project.build.sourceEncoding>\n  <spring.version>4.2.1.RELEASE<\/spring.version>\n  <hibernate.version>4.3.5.Final<\/hibernate.version>\n\n <\/properties>\n\n <dependencies>\n  <dependency>\n   <groupId>junit<\/groupId>\n   <artifactId>junit<\/artifactId>\n   <version>3.8.1<\/version>\n   <scope>test<\/scope>\n  <\/dependency>\n  <dependency>\n   <groupId>org.springframework<\/groupId>\n   <artifactId>spring-core<\/artifactId>\n   <version>${spring.version}<\/version>\n  <\/dependency>\n  <dependency>\n   <groupId>org.springframework<\/groupId>\n   <artifactId>spring-context<\/artifactId>\n   <version>${spring.version}<\/version>\n  <\/dependency>\n  <dependency>\n   <groupId>org.springframework.data<\/groupId>\n   <artifactId>spring-data-jpa<\/artifactId>\n   <version>1.8.0.RELEASE<\/version>\n  <\/dependency>\n  <dependency>\n   <groupId>org.hibernate.javax.persistence<\/groupId>\n   <artifactId>hibernate-jpa-2.1-api<\/artifactId>\n   <version>1.0.0.Final<\/version>\n  <\/dependency>\n  <dependency>\n   <groupId>org.hibernate<\/groupId>\n   <artifactId>hibernate-entitymanager<\/artifactId>\n   <version>${hibernate.version}<\/version>\n   <scope>runtime<\/scope>\n  <\/dependency>\n  <dependency>\n   <groupId>mysql<\/groupId>\n   <artifactId>mysql-connector-java<\/artifactId>\n   <version>5.1.6<\/version>\n  <\/dependency>\n  <dependency>\n   <groupId>commons-dbcp<\/groupId>\n   <artifactId>commons-dbcp<\/artifactId>\n   <version>1.4<\/version>\n  <\/dependency>\n <\/dependencies>\n<\/project><\/pre>\n<div><\/div>\n<p><b>Step 3:<\/b>Lets create our bean class Country.java<\/p>\n<pre name=\"code\">package org.arpit.java2blog.model;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n\/*\n * This is our model class and it corresponds to Country table in database\n *\/\n@Entity\n@Table(name=\"COUNTRY\")\npublic class Country{\n\n @Id\n @Column(name=\"id\")\n @GeneratedValue(strategy=GenerationType.IDENTITY)\n int id;\n\n @Column(name=\"countryName\")\n String countryName; \n\n @Column(name=\"population\")\n long population;\n\n public Country() {\n  super();\n }\n public Country(int i, String countryName,long population) {\n  super();\n  this.id = i;\n  this.countryName = countryName;\n  this.population=population;\n }\n public int getId() {\n  return id;\n }\n public void setId(int id) {\n  this.id = id;\n }\n public String getCountryName() {\n  return countryName;\n }\n public void setCountryName(String countryName) {\n  this.countryName = countryName;\n }\n public long getPopulation() {\n  return population;\n }\n public void setPopulation(long population) {\n  this.population = population;\n } \n\n @Override\n public String toString() {\n  return \"Country [id=\" + id + \", countryName=\" + countryName + \", population=\" + population + \"]\";\n }\n}<\/pre>\n<p><b>Step 4:<\/b><br \/>\nCreate a repository interface named CountryRepository.java<br \/>\nYou don&#8217;t need to provide implementation of it, Spring JPA will provide it automatically.<\/p>\n<pre name=\"code\">package org.arpit.java2blog.jpa;\n\nimport java.util.List;\n\nimport org.arpit.java2blog.model.Country;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.data.repository.CrudRepository;\n\npublic interface CountryRepository extends CrudRepository<Country,Integer> { \n    Country findCountryByCountryName(String name);\n    @Query(\"select country from Country country where country.population >= ?1 and country.population  <= ?2\")\n    List findCountriesPopulationRange(long from, long to); \n}<\/pre>\n<p><b>Step 5:<\/b><br \/>\nCreate applicationcontext.xml as below<\/p>\n<pre class=\"xml \" data-blogger-escaped-name=\"code\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"\n xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xmlns:jdbc=\"http:\/\/www.springframework.org\/schema\/jdbc\"\n xmlns:tx=\"http:\/\/www.springframework.org\/schema\/tx\" xmlns:jpa=\"http:\/\/www.springframework.org\/schema\/data\/jpa\"\n xmlns:context=\"http:\/\/www.springframework.org\/schema\/context\"\n xsi:schemaLocation=\"http:\/\/www.springframework.org\/schema\/jdbc http:\/\/www.springframework.org\/schema\/jdbc\/spring-jdbc.xsd\n  http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\n  http:\/\/www.springframework.org\/schema\/data\/jpa http:\/\/www.springframework.org\/schema\/data\/jpa\/spring-jpa.xsd\n  http:\/\/www.springframework.org\/schema\/tx http:\/\/www.springframework.org\/schema\/tx\/spring-tx.xsd\n  http:\/\/www.springframework.org\/schema\/context http:\/\/www.springframework.org\/schema\/context\/spring-context.xsd\">\n<context:annotation-config\/>  \n <bean id=\"transactionManager\" class=\"org.springframework.orm.jpa.JpaTransactionManager\">\n  <property name=\"entityManagerFactory\" ref=\"entityManagerFactory\" \/>\n <\/bean>\n<jpa:repositories base-package=\"org.arpit.java2blog.jpa\" \/>\n\n <bean id=\"entityManagerFactory\"\n  class=\"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean\">\n  <property name=\"dataSource\" ref=\"dataSource\" \/>\n  <property name=\"packagesToScan\" value=\"org.arpit.java2blog\" \/>\n  <property name=\"jpaVendorAdapter\">\n   <bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter\">\n    <property name=\"generateDdl\" value=\"true\" \/>\n   <\/bean>\n  <\/property>\n <\/bean>\n\n <bean id=\"dataSource\" class=\"org.apache.commons.dbcp.BasicDataSource\"\n  destroy-method=\"close\">\n  <property name=\"driverClassName\" value=\"com.mysql.jdbc.Driver\" \/>\n  <property name=\"url\"\n   value=\"jdbc:mysql:\/\/localhost:3306\/CountryData\" \/>\n  <property name=\"username\" value=\"root\" \/>\n  <property name=\"password\" value=\"arpit123\" \/>\n <\/bean>\n<bean id=\"mainClass\" class=\"org.arpit.java2blog.main.SpringApplicationMainBean\">\n\n <\/bean>\n<\/beans><\/pre>\n<p>Configure datasource based on your connections details.<br \/>\nentityManagerFactory will have reference to dataSource and jpaVendorAdapter.<br \/>\n<b>Step 6:<\/b><br \/>\nCreate Main class named SpringApplicationMainBean.java as below<\/p>\n<pre name=\"code\">package org.arpit.java2blog.main;\n\nimport java.util.List;\n\nimport javax.sql.DataSource;\n\nimport org.arpit.java2blog.jpa.CountryRepository;\nimport org.arpit.java2blog.model.Country;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\npublic class SpringApplicationMainBean\n{\n@Autowired\nprivate CountryRepository repository;\n\n public static void main(String[] args) {\n\n  ApplicationContext context = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n  SpringApplicationMainBean samb= (SpringApplicationMainBean) context.getBean(\"mainClass\");  \n  samb.addCountries();\n\n  System.out.println(\"=====================================\");\n  \/\/ Read\n  Country countryRead = samb.getCountry(3);\n  System.out.println(\"Getting country with ID 3::\" + countryRead.getCountryName());\n\n  System.out.println(\"=====================================\");\n  System.out.println(\"Getting all Countries\");\n  \/\/ Get All\n  Iterable countryList = samb.getAllCountries();\n  countryList.forEach(c -> System.out.println(c));\n\n  System.out.println(\"=====================================\");\n  System.out.println(\"Finding countryName Bhutan\");\n  \/\/ find country by name\n  Country country =samb.findCountryByName(\"Bhutan\");\n  System.out.println(country);\n\n  System.out.println(\"=====================================\");\n  System.out.println(\"Finding All Countries which have population from 2000 to 20000\");\n  \/\/ find countries by population ranges\n  List countries=samb.findCountryByPopulationRange(2000,20000);\n  System.out.println(countries);\n\n  System.out.println(\"=====================================\");\n  System.out.println(\"We are done with all operations\");\n }\n\n public void addCountries()\n {\n   \/\/ Add Country object to database\n   Country countryUSA = new Country();\n   countryUSA.setCountryName(\"USA\");\n   countryUSA.setPopulation(10000);\n\n   Country countryIndia = new Country();\n   countryIndia.setCountryName(\"India\");\n   countryIndia.setPopulation(20000);\n\n   Country countryChina = new Country();\n   countryChina.setCountryName(\"China\");\n   countryChina.setPopulation(30000);\n\n   Country countryBhutan = new Country();\n   countryBhutan.setCountryName(\"Bhutan\");\n   countryBhutan.setPopulation(5000);\n\n   \/\/ Add Country\n   repository.save(countryUSA);\n   repository.save(countryIndia);\n   repository.save(countryChina);\n   repository.save(countryBhutan);\n }\n public Country getCountry(int id)\n {\n  return repository.findOne(id);\n }\n public Iterable getAllCountries()\n {\n  return repository.findAll();\n }\n\n public Country findCountryByName(String countryName)\n {\n  return repository.findCountryByCountryName(countryName);\n }\n\n public List findCountryByPopulationRange(long populationTo,long populationFrom)\n {\n  return repository.findCountriesPopulationRange(populationTo,populationFrom);\n }\n}\n\n<\/pre>\n<p>As you can see, we have used autowire annotation to inject CountryRepository in above class. Spring automatically provides implementation for some common methods such as save, delete, findAll etc.<br \/>\nWhen you run above program, you will get below output:<\/p>\n<pre name=\"code\">SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http:\/\/www.slf4j.org\/codes.html#StaticLoggerBinder for further details.\nSep 13, 2016 12:36:15 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation\nINFO: HHH000204: Processing PersistenceUnitInfo [\n name: default\n ...]\nSep 13, 2016 12:36:16 PM org.hibernate.Version logVersion\nINFO: HHH000412: Hibernate Core {4.3.5.Final}\nSep 13, 2016 12:36:16 PM org.hibernate.cfg.Environment \nINFO: HHH000206: hibernate.properties not found\nSep 13, 2016 12:36:16 PM org.hibernate.cfg.Environment buildBytecodeProvider\nINFO: HHH000021: Bytecode provider name : javassist\nSep 13, 2016 12:36:16 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager \nINFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}\nSep 13, 2016 12:36:17 PM org.hibernate.dialect.Dialect \nINFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect\nSep 13, 2016 12:36:17 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation\nINFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4\nSep 13, 2016 12:36:17 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory \nINFO: HHH000397: Using ASTQueryTranslatorFactory\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute\nINFO: HHH000228: Running hbm2ddl schema update\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute\nINFO: HHH000102: Fetching database metadata\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute\nINFO: HHH000396: Updating schema\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.TableMetadata \nINFO: HHH000261: Table found: CountryData.country\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.TableMetadata \nINFO: HHH000037: Columns: [countryname, id, population]\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.TableMetadata \nINFO: HHH000108: Foreign keys: []\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.TableMetadata \nINFO: HHH000126: Indexes: [primary]\nSep 13, 2016 12:36:18 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute\nINFO: HHH000232: Schema update complete\n=====================================\nGetting country with ID 3::China\n=====================================\nGetting all Countries\nCountry [id=1, countryName=USA, population=10000]\nCountry [id=2, countryName=India, population=20000]\nCountry [id=3, countryName=China, population=30000]\nCountry [id=4, countryName=Bhutan, population=5000]\n=====================================\nFinding countryName Bhutan\nCountry [id=4, countryName=Bhutan, population=5000]\n=====================================\nFinding All Countries which have population from 2000 to 20000\n[Country [id=1, countryName=USA, population=10000], Country [id=2, countryName=India, population=20000], Country [id=4, countryName=Bhutan, population=5000]]\n=====================================\nWe are done with all operations<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Table of ContentsWhy Spring data JPA:Download source code: In this post, we are going to see about Spring data JPA. Spring data JPA provides jpaTemplate to integrate Spring and JPA. Why Spring data JPA: It is quite cumbersome to implement data access layer now a day. You need to write too much boiler plate code [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_mi_skip_tracking":false},"categories":[37,39],"tags":[],"_links":{"self":[{"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/posts\/115"}],"collection":[{"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/comments?post=115"}],"version-history":[{"count":0,"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/posts\/115\/revisions"}],"wp:attachment":[{"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/categories?post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/java2blog.com\/wp-json\/wp\/v2\/tags?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}