Over a million developers have joined DZone.

Spring Data JPA With an Embedded Database and Spring Boot

DZone's Guide to

Spring Data JPA With an Embedded Database and Spring Boot

You can use Spring Data JPA to persist data to an embedded H2 database with RESTful web services and some helpful Spring annotations.

· Database Zone
Free Resource

Learn how to create flexible schemas in a relational database using SQL for JSON.

In this post, we will create a RESTful web service that will use JPA to persist the data in an embedded database (H2). Also, you can read more on RESTful web services here.

Adding pom.xml Dependencies

We will add spring-boot-starter-jpa to manage dependencies. We will use the H2 embedded database server for persistence.


Creating Entities

We have three entities in the example project: Product, Rating, and User.

@Table(name = "product_ratings", schema = "product")
public class Rating {
    private Long ratingId;

    private double rating;

    private String productId;

    private String userId;

    public Rating() {


    public Rating(Long ratingId, double rating, String productId, String userId) {
        this.ratingId = ratingId;
        this.rating = rating;
        this.productId = productId;
        this.userId = userId;
    //getters, setters, toString, hashCode, equals

@Entity annotation specifies that this is an entity class. @Table annotation specifies the primary table for an entity class. You can configure the table_name and schema using this annotation for the entity class. @Id specifies that this field is the primary key of the entity. @GeneratedValue specifies how the primary key will be generated. @Column is used to specify the mapped column for the property or field. You can also configure whether the property is unique, nullable, its length, precision, scale, and/or if you want to insert or update it in the table.

Creating Repositories

You can extend the JpaRepository, CrudRepository interface to create your repository.

public interface ProductRepository extends JpaRepository<Product, String> {


Here, I created a ProductRepository interface that extends the JpaRepository interface. You may wonder why, instead of writing a repository class, we created an interface and where it will be implemented? The simple answer is the SimpleJpaRepository class. A proxy is generated by Spring, and all the requests are catered by the SimpleJpaRepository.

This contains all the basic methods like find, delete, save, findAll, and a few sort-related/criteria-based search methods. There could be a case where you need to write your own specific method and, in my case, finding all the ratings of a product. This could be done as follows.

public interface RatingRepository extends JpaRepository<Rating, Long> {
    public Iterable<Rating> getRatingsByProductId(final String productId);


This annotation will enable JPA repositories. This will scan for Spring Data repositories in the annotated configuration class by default. You can also change the basePackages to scan in this annotation:

public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);

In our example, we have used this annotation in our App class, so it will scan all the packages in and under com.gauravbytes.gkart

These are the few steps to create a simple JPA project. You can get the full code on GitHub.

A Few Important Points

If you are using the embedded server in the above example, then you may need to set the following configurations:

  • Adding schema.sql in the classpath, if you are using schema in your tables (entity classes). You can get a sample here.
  • You can change the datasource name (by default, testdb) and other properties. See org.springframework.boot.autoconfigure.jdbc.DataSourceProperties for a full list of properties that you can configure.

Create flexible schemas using dynamic columns for semi-structured data. Learn how.

spring jpa ,database ,h2 ,data persistence ,tutorial

Published at DZone with permission of Gaurav Rai Mazra, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}