JPA Repository vs CRUD Repository

JPA Repository vs CRUD Repository

JPA Repository

JpaRepository is a part of the Spring Data JPA library, which is an extension of the CrudRepository interface. It provides JPA-related methods such as flushing the persistence context and delete operations that leverage the EntityManager’s delete methods. Additionally, it supports batch deletes, batch inserts, and pagination and sorting out of the box.

JPA Repository vs CRUD Repository

CRUD Repository

CrudRepository is a Spring Data interface for generic CRUD (Create, Read, Update, Delete) operations on a repository for a specific type. It provides methods such as save, findOne, findAll, count, delete, etc. This interface is very basic and provides the most fundamental operations.

Detailed Differences

  • 1.  Inheritance Hierarchy :
    • CrudRepository is a parent interface.
    • JpaRepository extends CrudRepository.
  • 2.  Functionality :
    • CrudRepository offers basic CRUD functionalities.
    • JpaRepository offers all CrudRepository functionalities and adds JPA-specific operations like flushing the persistence context and batch operations.
  • 3.  Pagination and Sorting :
    • CrudRepository does not directly support pagination and sorting.
    • JpaRepository provides built-in support for pagination and sorting.
  • 4.  Additional JPA-Specific Methods :
    • JpaRepository includes methods like findAll(Sort sort), findAll(Pageable pageable), saveAndFlush, and deleteInBatch.

Example in Java

Let’s create an example to illustrate the difference between JpaRepository and CrudRepository.

1. Entity Class
java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    
    // Getters and Setters
}

2. CRUD Repository Interface
java
import org.springframework.data.repository.CrudRepository;

public interface UserCrudRepository extends CrudRepository<User, Long> {
    // Custom query methods can be defined here
}

3. JPA Repository Interface
java
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserJpaRepository extends JpaRepository<User, Long> {
    // Custom query methods can be defined here
}

4. Service Layer Using Both Repositories
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {
    
    @Autowired
    private UserCrudRepository userCrudRepository;
    
    @Autowired
    private UserJpaRepository userJpaRepository;
    
    public void crudRepositoryExample() {
        // Using CrudRepository methods
        User user = new User();
        user.setName("John Doe");
        userCrudRepository.save(user);
        
        Iterable<User> users = userCrudRepository.findAll();
        users.forEach(u -> System.out.println(u.getName()));
    }
    
    public void jpaRepositoryExample() {
        // Using JpaRepository methods
        User user = new User();
        user.setName("Jane Doe");
        userJpaRepository.saveAndFlush(user);
        
        List<User> users = userJpaRepository.findAll();
        users.forEach(u -> System.out.println(u.getName()));
        
        List<User> sortedUsers = userJpaRepository.findAll(Sort.by(Sort.Direction.ASC, "name"));
        sortedUsers.forEach(u -> System.out.println(u.getName()));
    }
}

In this example, the UserService class demonstrates how to use both CrudRepository and JpaRepository. The crudRepositoryExample method uses basic CRUD operations, while the jpaRepositoryExample method uses additional JPA-specific operations provided by JpaRepository.