{"id":4363,"date":"2018-05-18T15:31:12","date_gmt":"2018-05-18T10:01:12","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=4363"},"modified":"2023-01-20T18:55:43","modified_gmt":"2023-01-20T13:25:43","slug":"spring-data-jpa","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/","title":{"rendered":"Spring Data JPA"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p><strong>Spring Data JPA<\/strong> is not a JPA provider but is a specification. It is a library \/ framework that adds an extra layer of abstraction on the top of our JPA provider. It simply \u201chides\u201d the Java Persistence API (and the JPA provider) behind its repository abstraction.<\/p>\n<p>JPA is the sun specification for persisting objects in the enterprise application. It is used as replacement for complex entity beans.<\/p>\n<p>The implementation of JPA specification are provided by many JPA provider such as: Hibernate, Toplink, iBatis, OpenJPA etc.<\/p>\n<h4>Features provided by Spring Data JPA :<\/h4>\n<ul>\n<li>Create and support repositories created with Spring and JPA<\/li>\n<li>Support JPA queries<\/li>\n<li>Support for batch loading, sorting, dynamical queries<\/li>\n<li>Supports XML mapping for entities<\/li>\n<li>Reduce code size for generic CRUD operations by using CrudRepository<\/li>\n<\/ul>\n<h4>What Components Do We Need?<\/h4>\n<ul>\n<li>The<strong> JDBC driver<\/strong>\u00a0which enables java application to interact with the database.<\/li>\n<li>The <strong>datasource<\/strong> provides all technical information needed to access data.<\/li>\n<li>The <strong>JPA Provider<\/strong> implements the Java Persistence API. We use Hibernate because it is the most common JPA provider.<\/li>\n<li><strong><a href=\"https:\/\/docs.spring.io\/spring-data\/jpa\/docs\/current\/reference\/html\/\" target=\"_blank\" rel=\"noopener\">Spring Data JPA<\/a> <\/strong>hides the used JPA provider behind its repository abstraction.<\/li>\n<\/ul>\n<p>The<strong> Java Persistence API<\/strong> is used for managing, persisting and accessing data between objects and relation database. Hibernate is an ORM (Object Relational Mapping) tool which implements JPA specification.<\/p>\n<p>Following program illustrates how to integrate Spring with JPA, using the Hibernate as a JPA provider :<\/p>\n<h2 id=\"exploring-the-directory-structure\">Exploring the Directory Structure :<\/h2>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-4476 aligncenter\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Image-1-202x300.png\" alt=\"Directory Structure\" width=\"255\" height=\"378\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Image-1-202x300.png 202w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Image-1.png 275w\" sizes=\"(max-width: 255px) 100vw, 255px\" \/><\/p>\n<p><strong>pom.xml file :\u00a0<\/strong>Adding Spring, Hibernate and MySQL dependencies in maven project as follows:<\/p>\n<pre class=\"lang:default decode:true\" title=\"Edit your pom.xml file and add Spring, Hibernate and MySQL dependencies as follows.\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n  xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 \r\n  http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n  &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\r\n  &lt;groupId&gt;com.innovationM.hibernate&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;spring-hibernate-jpa-example&lt;\/artifactId&gt;\r\n  &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n  &lt;packaging&gt;jar&lt;\/packaging&gt;\r\n\r\n  &lt;name&gt;spring-hibernate-jpa-tutorial&lt;\/name&gt;\r\n  &lt;url&gt;http:\/\/maven.apache.org&lt;\/url&gt;\r\n\r\n  &lt;properties&gt;\r\n    &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\r\n  &lt;\/properties&gt;\r\n\r\n  &lt;dependencies&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;spring-context&lt;\/artifactId&gt;\r\n      &lt;version&gt;4.3.7.RELEASE&lt;\/version&gt;\r\n    &lt;\/dependency&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;spring-orm&lt;\/artifactId&gt;\r\n      &lt;version&gt;4.3.7.RELEASE&lt;\/version&gt;\r\n    &lt;\/dependency&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;org.hibernate&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;hibernate-core&lt;\/artifactId&gt;\r\n      &lt;version&gt;5.2.9.Final&lt;\/version&gt;\r\n    &lt;\/dependency&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;org.apache.commons&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;commons-dbcp2&lt;\/artifactId&gt;\r\n      &lt;version&gt;2.1.1&lt;\/version&gt;\r\n    &lt;\/dependency&gt;\r\n    &lt;dependency&gt; \r\n      &lt;groupId&gt;mysql&lt;\/groupId&gt; \r\n      &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt; \r\n      &lt;version&gt;6.0.5&lt;\/version&gt; \r\n    &lt;\/dependency&gt;\r\n  &lt;\/dependencies&gt;\r\n\r\n  &lt;build&gt;\r\n    &lt;sourceDirectory&gt;src\/main\/java&lt;\/sourceDirectory&gt;\r\n    &lt;plugins&gt;\r\n      &lt;plugin&gt;\r\n        &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\r\n        &lt;version&gt;3.5.1&lt;\/version&gt;\r\n        &lt;configuration&gt;\r\n          &lt;source&gt;1.8&lt;\/source&gt;\r\n          &lt;target&gt;1.8&lt;\/target&gt;\r\n        &lt;\/configuration&gt;\r\n      &lt;\/plugin&gt;\r\n    &lt;\/plugins&gt;\r\n  &lt;\/build&gt;\r\n&lt;\/project&gt;\r\n<\/pre>\n<p><strong>JPA Entity class :<\/strong>\u00a0 This is entity class <strong>Person<\/strong>\u00a0consists of getter and setter methods.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring.entity;\r\n\r\nimport javax.persistence.Column;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Table;\r\n\r\n@Entity\r\n@Table(name = \"PERSONS\")\r\npublic class Person {\r\n\r\n   @Id\r\n   @GeneratedValue(strategy = GenerationType.IDENTITY)\r\n   private Long id;\r\n\r\n   @Column(name = \"FIRST_NAME\")\r\n   private String firstName;\r\n\r\n   @Column(name = \"LAST_NAME\")\r\n   private String lastName;\r\n\r\n   @Column(name = \"EMAIL\")\r\n   private String email;\r\n\r\n   public Person() {}\r\n   \r\n   public Person(String firstName, String lastName, String email) {\r\n      this.firstName = firstName;\r\n      this.lastName = lastName;\r\n      this.email = email;\r\n   }\r\n\r\n   \/\/getter and setter methods.\r\n}\r\n<\/pre>\n<h3>Data Access Object (DAO) class :<\/h3>\n<p><strong>PersonDao.java : <\/strong>This repository interface consists of methods to be implemented by implementation class.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport com.innovationM.spring.entity.Person;\r\n\r\npublic interface PersonDao {\r\n   void add(Person person);\r\n   List&lt;Person&gt; listPersons();\r\n}<\/pre>\n<p><strong>PersonDaoImp.java :<\/strong> This repository class implements <strong>PersonDao<\/strong>\u00a0interface to provide method body accordingly as to persist data in database.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport javax.persistence.EntityManager;\r\nimport javax.persistence.PersistenceContext;\r\nimport javax.persistence.criteria.CriteriaQuery;\r\nimport javax.persistence.criteria.Root;\r\n\r\nimport org.springframework.stereotype.Repository;\r\n\r\nimport com.innovationM.spring.entity.Person;\r\n\r\n@Repository\r\npublic class PersonDaoImp implements PersonDao {\r\n\r\n   @PersistenceContext\r\n   private EntityManager em;\r\n\r\n   @Override\r\n   public void add(Person person) {\r\n      em.persist(person);\r\n   }\r\n\r\n   @Override\r\n   public List&lt;Person&gt; listPersons() {\r\n      CriteriaQuery&lt;Person&gt; criteriaQuery = em.getCriteriaBuilder().createQuery(Person.class);\r\n      @SuppressWarnings(\"unused\")\r\n      Root&lt;Person&gt; root = criteriaQuery.from(Person.class);\r\n      return em.createQuery(criteriaQuery).getResultList();\r\n   }\r\n\r\n}\r\n<\/pre>\n<h3>Service class :<\/h3>\n<p><strong>PersonService.java : <\/strong>This interface consists of methods to be implemented by implementation class at service layer.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring.service;\r\n\r\nimport java.util.List;\r\n\r\nimport com.innovationM.spring.entity.Person;\r\n\r\npublic interface PersonService {\r\n    void add(Person person);\r\n    List&lt;Person&gt; listPersons();\r\n}\r\n<\/pre>\n<p><strong>PersonServiceImp.java : <\/strong>This service class implements <strong>PersonService<\/strong> interface to provide method body accordingly to our business logic.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring.service;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\nimport com.innovationM.spring.dao.PersonDao;\r\nimport com.innovationM.spring.entity.Person;\r\n\r\n@Service\r\npublic class PersonServiceImp implements PersonService {\r\n\r\n   @Autowired\r\n   private PersonDao userDao;\r\n\r\n   @Transactional\r\n   public void add(Person person) {\r\n      userDao.add(person);\r\n   }\r\n\r\n   @Transactional(readOnly = true)\r\n   public List&lt;Person&gt; listPersons() {\r\n      return userDao.listPersons();\r\n   }\r\n\r\n}\r\n<\/pre>\n<p><strong>persistence.xml file :<\/strong> This xml file contains information to connect with database.<\/p>\n<pre class=\"lang:default decode:true\">&lt;persistence xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\"\r\n  xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n  xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\r\n             http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\/persistence_2_1.xsd\"\r\n  version=\"2.1\"&gt;\r\n\r\n  &lt;persistence-unit name=\"LOCAL_PERSISTENCE\"&gt;\r\n    &lt;description&gt; Spring Hibernate JPA Configuration Example&lt;\/description&gt;\r\n    &lt;provider&gt;org.hibernate.jpa.HibernatePersistenceProvider&lt;\/provider&gt;\r\n\r\n    &lt;properties&gt;\r\n      &lt;property name=\"javax.persistence.jdbc.driver\" value=\"com.mysql.cj.jdbc.Driver\" \/&gt;\r\n      &lt;property name=\"javax.persistence.jdbc.url\" value=\"jdbc:mysql:\/\/localhost:3306\/demo\" \/&gt;\r\n      &lt;property name=\"javax.persistence.jdbc.user\" value=\"root\" \/&gt;\r\n      &lt;property name=\"javax.persistence.jdbc.password\" value=\"root\" \/&gt;\r\n      &lt;property name=\"hibernate.show_sql\" value=\"true\" \/&gt;\r\n      &lt;property name=\"hibernate.hbm2ddl.auto\" value=\"update\" \/&gt;\r\n    &lt;\/properties&gt;\r\n\r\n  &lt;\/persistence-unit&gt;\r\n&lt;\/persistence&gt;<\/pre>\n<p><strong>Spring configuration :\u00a0<\/strong> This is configuration class with <a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/javadoc-api\/org\/springframework\/transaction\/annotation\/EnableTransactionManagement.html\" target=\"_blank\" rel=\"noopener\">@EnableTransactionManagement<\/a> annotation to enable transaction management capability.<\/p>\n<pre class=\"lang:default decode:true \">package com.innovationM.spring.config;\r\n\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.ComponentScan;\r\nimport org.springframework.context.annotation.ComponentScans;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.orm.jpa.JpaTransactionManager;\r\nimport org.springframework.orm.jpa.LocalEntityManagerFactoryBean;\r\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\r\n\r\n@Configuration\r\n@EnableTransactionManagement\r\n@ComponentScans(value = { @ComponentScan(\"com.innovationM.spring.dao\"),\r\n      @ComponentScan(\"com.innovationM.spring.service\") })\r\npublic class AppConfig {\r\n\r\n   @Bean\r\n   public LocalEntityManagerFactoryBean geEntityManagerFactoryBean() {\r\n      LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();\r\n      factoryBean.setPersistenceUnitName(\"LOCAL_PERSISTENCE\");\r\n      return factoryBean;\r\n   }\r\n\r\n   @Bean\r\n   public JpaTransactionManager geJpaTransactionManager() {\r\n      JpaTransactionManager transactionManager = new JpaTransactionManager();\r\n      transactionManager.setEntityManagerFactory(geEntityManagerFactoryBean().getObject());\r\n      return transactionManager;\r\n   }\r\n}\r\n<\/pre>\n<p><strong>Run application :<\/strong> This is main class to run the application.<\/p>\n<pre class=\"lang:default decode:true\">package com.innovationM.spring;\r\n\r\nimport java.sql.SQLException;\r\nimport java.util.List;\r\n\r\nimport org.springframework.context.annotation.AnnotationConfigApplicationContext;\r\n\r\nimport com.innovationM.spring.config.AppConfig;\r\nimport com.innovationM.spring.entity.Person;\r\nimport com.innovationM.spring.service.PersonService;\r\n\r\npublic class MainApp {\r\n   public static void main(String[] args) throws SQLException {\r\n      AnnotationConfigApplicationContext context = \r\n            new AnnotationConfigApplicationContext(AppConfig.class);\r\n\r\n      PersonService personService = context.getBean(PersonService.class);\r\n\r\n      \/\/ Add Persons\r\n      personService.add(new Person(\"Rahul\", \"Gupta\", \"rahulgupta@company.com\"));\r\n      personService.add(new Person(\"Akshay\", \"Sharma\", \"akshaysharma@company.com\"));\r\n      personService.add(new Person(\"Ankit\", \"Sarraf\", \"ankitsarraf@company.com\"));\r\n\r\n      \/\/ Get Persons\r\n      List&lt;Person&gt; persons = personService.listPersons();\r\n      for (Person person : persons) {\r\n         System.out.println(\"Id = \"+person.getId());\r\n         System.out.println(\"First Name = \"+person.getFirstName());\r\n         System.out.println(\"Last Name = \"+person.getLastName());\r\n         System.out.println(\"Email = \"+person.getEmail());\r\n         System.out.println();\r\n      }\r\n\r\n      context.close();\r\n   }\r\n}\r\n<\/pre>\n<p><strong>Output : <\/strong>We will get the following output on console.<\/p>\n<pre class=\"lang:default decode:true \">Hibernate: insert into PERSONS (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)\r\nHibernate: insert into PERSONS (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)\r\nHibernate: insert into PERSONS (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)\r\nHibernate: select person0_.id as id1_0_, person0_.EMAIL as EMAIL2_0_, person0_.FIRST_NAME as FIRST_NA3_0_, person0_.LAST_NAME as LAST_NAM4_0_ from PERSONS person0_\r\nId = 1\r\nFirst Name = Rahul\r\nLast Name = Gupta\r\nEmail = rahulgupta@company.com\r\n\r\nId = 2\r\nFirst Name = Akshay\r\nLast Name = Sharma\r\nEmail = akshaysharma@company.com\r\n\r\nId = 3\r\nFirst Name = Ankit\r\nLast Name = Sarraf\r\nEmail = ankitsarraf@company.com<\/pre>\n<p>You can <strong>download<\/strong> this example : <a href=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/spring-data-jpa-example.zip\" target=\"_blank\" rel=\"noopener\">SPRING DATA JPA EXAMPLE<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Spring Data JPA is not a JPA provider but is a specification. It is a library \/ framework that adds an extra layer of abstraction on the top of our JPA provider. It simply \u201chides\u201d the Java Persistence API (and the JPA provider) behind its repository abstraction. JPA is the sun specification for persisting [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4472,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[256,263],"tags":[265,224,266,264,243],"class_list":["post-4363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-application","category-orm","tag-hibernate","tag-java","tag-jpa","tag-orm","tag-spring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring Data JPA - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Data JPA - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Spring Data JPA is not a JPA provider but is a specification. It is a library \/ framework that adds an extra layer of abstraction on the top of our JPA provider. It simply \u201chides\u201d the Java Persistence API (and the JPA provider) behind its repository abstraction. JPA is the sun specification for persisting [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-18T10:01:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-20T13:25:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1140\" \/>\n\t<meta property=\"og:image:height\" content=\"633\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Spring Data JPA\",\"datePublished\":\"2018-05-18T10:01:12+00:00\",\"dateModified\":\"2023-01-20T13:25:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/\"},\"wordCount\":391,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/05\\\/Spring-Details.jpg\",\"keywords\":[\"Hibernate\",\"java\",\"JPA\",\"ORM\",\"Spring\"],\"articleSection\":[\"Java Application\",\"ORM\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/\",\"name\":\"Spring Data JPA - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/05\\\/Spring-Details.jpg\",\"datePublished\":\"2018-05-18T10:01:12+00:00\",\"dateModified\":\"2023-01-20T13:25:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/05\\\/Spring-Details.jpg\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/05\\\/Spring-Details.jpg\",\"width\":1140,\"height\":633},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/spring-data-jpa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Data JPA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Data JPA - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/","og_locale":"en_US","og_type":"article","og_title":"Spring Data JPA - InnovationM - Blog","og_description":"&nbsp; Spring Data JPA is not a JPA provider but is a specification. It is a library \/ framework that adds an extra layer of abstraction on the top of our JPA provider. It simply \u201chides\u201d the Java Persistence API (and the JPA provider) behind its repository abstraction. JPA is the sun specification for persisting [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/","og_site_name":"InnovationM - Blog","article_published_time":"2018-05-18T10:01:12+00:00","article_modified_time":"2023-01-20T13:25:43+00:00","og_image":[{"width":1140,"height":633,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg","type":"image\/jpeg"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Spring Data JPA","datePublished":"2018-05-18T10:01:12+00:00","dateModified":"2023-01-20T13:25:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/"},"wordCount":391,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg","keywords":["Hibernate","java","JPA","ORM","Spring"],"articleSection":["Java Application","ORM"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/","url":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/","name":"Spring Data JPA - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg","datePublished":"2018-05-18T10:01:12+00:00","dateModified":"2023-01-20T13:25:43+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2018\/05\/Spring-Details.jpg","width":1140,"height":633},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/spring-data-jpa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Data JPA"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/4363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=4363"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/4363\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/4472"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=4363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=4363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=4363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}