Spring Boot - Spring Data JPA with embedded database

We will start with project setup then create entities, repositories and discuss about @EnableJpaRepositories annotation.

1. Project Setup

We will add spring-boot-starter-jpa to manage dependencies. We will use h2 embedded database server for persistence. Let's start with adding pom.xml dependencies.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

2. Creating Entity classes

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

@Entity
@Table(name = "product_ratings", schema = "product")
public class Rating {
@Id
@GeneratedValue
@Column(name="rating_id")
private Long ratingId;

private double rating;

@Column(name="product_id")
private String productId;

@Column(name="user_id")
private String userId;

public Rating() {

}

public Rating(Long ratingId, double rating, String productId, String userId) {
super();
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 primary key will be generated. @Column is used to specify the mapped column for the property or field. You can also configure if the property is unique, nullable, length, precision, scale and/or if you want to insert or update it in the table.

3. Creating Repositories

We can extend the JpaRepository or CrudRepository interface to create the repository.

@Transactional
@Repository
public interface ProductRepository extends JpaRepository<Product, String> {

}

Here, we created a ProductRepository interface which extends JpaRepository interface. You may wonder that instead of writing a repository class, we have created an interface and where will this get the implementation? The answer is SimpleJpaRepository class. A Proxy is generated by Spring and all the request is catered by the SimpleJpaRepository.

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

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

4. @EnableJpaRepositories annotation

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

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

You can see the full code on Github used in this example.

Few important points

If you are using 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 sample here. You can change the datasource name(by default testdb) and other properties. See org.springframework.boot.autoconfigure.jdbc.DataSourceProperties for full list of properties that you can configure.



Tags: Spring Framework, Spring Boot, Spring Boot starters, Spring Data JPA, Restful webservices with Spring Boot

← Back home