JPA is a specification which specifies how to access, manage and persist information/data between java objects and relational databases. It provides a standard approach for ORM, Object Relational Mapping. Spring Boot provides a seemless integration with JPA.
Spring Data
Spring Data is a Spring-based programming model for data access. It reduces the amount of code needed for working with databases and datastores. It consists of several modules. The Spring Data JPA simplifies the development of Spring applications that use JPA technology.
With Spring Data, we define a repository interface for each domain entity in the application. A repository contains methods for performing CRUD operations, sorting, and paginating data. A repository is created by extending specific repository interfaces, such as CrudRepository
, PagingAndSortingRepository
, or JpaRepository
.
JpaRepository
JpaRepository
is JPA specific extension of Repository
. It contains the full API of CrudRepository
and PagingAndSortingRepository
. So it has API for basic CRUD operations and also API for pagination and sorting.
Spring Boot JpaRepository example
Maven Dependencies
To enable JPA in a Spring Boot application, we need the spring-boot-starter and spring-boot-starter-data-jpa dependencies:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
The spring-boot-starter contains the necessary auto-configuration for Spring JPA. Also, the spring-boot-starter-jpa project references all the necessary dependencies such as hibernate-core.
Define a Simple Entity
In this example, you store Customer
objects, each annotated as a JPA entity. The following listing shows the Customer class :
package com.example.accessingdatajpa;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
The Customer
class is annotated with @Entity
, indicating that it is a JPA entity. (Because no @Table
annotation exists, it is assumed that this entity is mapped to a table named Customer
.
The Customer
object’s id
property is annotated with @Id
so that JPA recognizes it as the object’s ID. The id
property is also annotated with @GeneratedValue
to indicate that the ID should be generated automatically.
The other two properties, firstName
and lastName
, are left unannotated. It is assumed that they are mapped to columns that share the same names as the properties themselves.
Create Simple Queries
Spring Data JPA focuses on using JPA to store data in a relational database. Its most compelling feature is the ability to create repository implementations automatically, at runtime, from a repository interface.
To see how this works, create a repository interface that works with Customer
entities as the following listing shows:
package com.example.accessingdatajpa;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
@Repository
is a marker annotation, which indicates that the underlying interface is a repository. CustomerRepository
extends the JpaRepository
interface. The type of entity and ID that it works with, Customer
and Long
, are specified in the generic parameters on JpaRepository
. By extending JpaRepository
, CustomerRepository
inherits several methods for working with Customer
persistence, including methods for saving, deleting, and finding Customer
entities.
Spring Data JPA also lets you define other query methods by declaring their method signature. For example, CustomerRepository
includes the findByLastName()
method.
In a typical Java application, you might expect to write a class that implements CustomerRepository
. However, that is what makes Spring Data JPA so powerful: You need not write an implementation of the repository interface. Spring Data JPA creates an implementation when you run the application.
Now you can wire up this example and see what it looks like!
Create an Application Class
The following listing shows the finished AccessingDataJpaApplication
class:
package com.example.accessingdatajpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class AccessingDataJpaApplication {
private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a few customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// fetch an individual customer by ID
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}
}
The AccessingDataJpaApplication
class includes a demo()
method that puts the CustomerRepository
through a few tests. First, it fetches the CustomerRepository
from the Spring application context. Then it saves a handful of Customer
objects, demonstrating the save()
method and setting up some data to work with. Next, it calls findAll()
to fetch all Customer
objects from the database. Then it calls findById()
to fetch a single Customer
by its ID. Finally, it calls findByLastName()
to find all customers whose last name is “Bauer”. The demo()
method returns a CommandLineRunner
bean that automatically runs the code when the application launches.
When you run your application, you should see output similar to the following:
== Customers found with findAll():
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=2, firstName='Chloe', lastName='O'Brian']
Customer[id=3, firstName='Kim', lastName='Bauer']
Customer[id=4, firstName='David', lastName='Palmer']
Customer[id=5, firstName='Michelle', lastName='Dessler']
== Customer found with findById(1L):
Customer[id=1, firstName='Jack', lastName='Bauer']
== Customer found with findByLastName('Bauer'):
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=3, firstName='Kim', lastName='Bauer']
By default, Spring Boot enables JPA repository support and looks in the package (and its subpackages) where @SpringBootApplication
is located. If your configuration has JPA repository interface definitions located in a package that is not visible, you can point out alternate packages by using @EnableJpaRepositories
and its type-safe basePackageClasses=MyRepository.class
parameter.
I hope you have enjoyed this post and it helped you with basics of accessing the data using JPA interface provided by Spring boot . Please like and share and feel free to comment if you have any suggestions or feedback.
Like this:
Like Loading...
Pradeep Mishra
Share post:
Spring Data
Spring Data is a Spring-based programming model for data access. It reduces the amount of code needed for working with databases and datastores. It consists of several modules. The Spring Data JPA simplifies the development of Spring applications that use JPA technology.
With Spring Data, we define a repository interface for each domain entity in the application. A repository contains methods for performing CRUD operations, sorting, and paginating data. A repository is created by extending specific repository interfaces, such as
CrudRepository
,PagingAndSortingRepository
, orJpaRepository
.JpaRepository
JpaRepository
is JPA specific extension ofRepository
. It contains the full API ofCrudRepository
andPagingAndSortingRepository
. So it has API for basic CRUD operations and also API for pagination and sorting.Spring Boot JpaRepository example
Maven Dependencies
To enable JPA in a Spring Boot application, we need the spring-boot-starter and spring-boot-starter-data-jpa dependencies:
The spring-boot-starter contains the necessary auto-configuration for Spring JPA. Also, the spring-boot-starter-jpa project references all the necessary dependencies such as hibernate-core.
Define a Simple Entity
In this example, you store
Customer
objects, each annotated as a JPA entity. The following listing shows the Customer class :The
Customer
class is annotated with@Entity
, indicating that it is a JPA entity. (Because no@Table
annotation exists, it is assumed that this entity is mapped to a table namedCustomer
.The
Customer
object’sid
property is annotated with@Id
so that JPA recognizes it as the object’s ID. Theid
property is also annotated with@GeneratedValue
to indicate that the ID should be generated automatically.The other two properties,
firstName
andlastName
, are left unannotated. It is assumed that they are mapped to columns that share the same names as the properties themselves.Create Simple Queries
Spring Data JPA focuses on using JPA to store data in a relational database. Its most compelling feature is the ability to create repository implementations automatically, at runtime, from a repository interface.
To see how this works, create a repository interface that works with
Customer
entities as the following listing shows:@Repository
is a marker annotation, which indicates that the underlying interface is a repository.CustomerRepository
extends theJpaRepository
interface. The type of entity and ID that it works with,Customer
andLong
, are specified in the generic parameters onJpaRepository
. By extendingJpaRepository
,CustomerRepository
inherits several methods for working withCustomer
persistence, including methods for saving, deleting, and findingCustomer
entities.Spring Data JPA also lets you define other query methods by declaring their method signature. For example,
CustomerRepository
includes thefindByLastName()
method.In a typical Java application, you might expect to write a class that implements
CustomerRepository
. However, that is what makes Spring Data JPA so powerful: You need not write an implementation of the repository interface. Spring Data JPA creates an implementation when you run the application.Now you can wire up this example and see what it looks like!
Create an Application Class
The following listing shows the finished
AccessingDataJpaApplication
class:The
AccessingDataJpaApplication
class includes ademo()
method that puts theCustomerRepository
through a few tests. First, it fetches theCustomerRepository
from the Spring application context. Then it saves a handful ofCustomer
objects, demonstrating thesave()
method and setting up some data to work with. Next, it callsfindAll()
to fetch allCustomer
objects from the database. Then it callsfindById()
to fetch a singleCustomer
by its ID. Finally, it callsfindByLastName()
to find all customers whose last name is “Bauer”. Thedemo()
method returns aCommandLineRunner
bean that automatically runs the code when the application launches.When you run your application, you should see output similar to the following:
I hope you have enjoyed this post and it helped you with basics of accessing the data using JPA interface provided by Spring boot . Please like and share and feel free to comment if you have any suggestions or feedback.
Share this:
Like this:
Build a module with its dependencies in a multi-module Maven project
INTRODUCTION The mechanism in Maven 4 that handles multi-module projects is referred to as the reactor. This part of the Maven core does the following: Module collection starts from one aggregator. read more…
Share this:
Like this:
Continue Reading
Schedule Jobs/Tasks Using Cron Expression in Spring with Example
When we have a requirement to run a task/job repeatedly after a particular time interval, we achieve this functionality by implementing Scheduling. To schedule jobs in the spring boot application to run. read more…
Share this:
Like this:
Continue Reading
Java Message Service (JMS) programming model
Before getting started with JMS programming model, I would suggest that first you go through the architecture, components and delivery model of JMS if not familiar. JMS defines an API. read more…
Share this:
Like this:
Continue Reading