Spring Data JPA中CrudRepository和JpaRepository接口的区别

Spring Data JPA中CrudRepository和JpaRepository接口的区别

技术背景

在Spring Data JPA中,CrudRepositoryJpaRepository是两个常用的接口,用于简化基于JPA的数据访问层开发。CrudRepository为实体提供基本的CRUD(创建、读取、更新、删除)操作,而JpaRepository在其基础上提供了更多JPA相关的功能。

实现步骤

1. 定义实体类

首先,需要定义一个实体类,例如PersonEntity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class PersonEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;

// Getters and setters
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

2. 使用CrudRepository

创建一个继承自CrudRepository的接口,用于对PersonEntity进行基本的CRUD操作:

1
2
3
4
import org.springframework.data.repository.CrudRepository;

public interface PersonEntityRepository extends CrudRepository<PersonEntity, Long> {
}

3. 使用JpaRepository

创建一个继承自JpaRepository的接口,除了基本的CRUD操作,还可以使用JpaRepository提供的其他功能:

1
2
3
4
5
6
7
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface PersonEntityRepository extends JpaRepository<PersonEntity, Long> {
List<PersonEntity> findByName(String name);
List<PersonEntity> findByAgeGreaterThan(int age);
}

核心代码

CrudRepository示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class PersonService {
@Autowired
private PersonEntityRepository personRepository;

public PersonEntity savePerson(PersonEntity person) {
return personRepository.save(person);
}

public Optional<PersonEntity> getPersonById(Long id) {
return personRepository.findById(id);
}

public void deletePerson(Long id) {
personRepository.deleteById(id);
}
}

JpaRepository示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PersonService {
@Autowired
private PersonEntityRepository personRepository;

public List<PersonEntity> getPersonsByName(String name) {
return personRepository.findByName(name);
}

public List<PersonEntity> getPersonsByAgeGreaterThan(int age) {
return personRepository.findByAgeGreaterThan(age);
}

public void flushChanges() {
personRepository.flush();
}
}

最佳实践

  • 基本CRUD操作:如果只需要基本的CRUD操作,建议使用CrudRepository,因为它提供了最基本的功能,并且代码更简洁。
  • 分页和排序:如果需要对数据进行分页和排序操作,可以使用PagingAndSortingRepository,它继承自CrudRepository,提供了分页和排序的方法。
  • JPA特定功能:如果需要使用JPA特定的功能,如刷新持久化上下文、批量删除等,建议使用JpaRepository

常见问题

1. CrudRepositoryJpaRepository的继承关系是怎样的?

JpaRepository继承自PagingAndSortingRepository,而PagingAndSortingRepository又继承自CrudRepository。因此,JpaRepository包含了CrudRepositoryPagingAndSortingRepository的所有功能。

2. saveAll()方法在CrudRepositoryJpaRepository中有什么区别?

CrudRepository中,saveAll()方法的返回类型是Iterable;而在JpaRepository中,saveAll()方法的返回类型是List

3. 应该避免使用JpaRepository吗?

一般来说,如果可能的话,应该尽量避免使用JpaRepository,因为它将存储库与JPA持久化技术紧密耦合。在大多数情况下,可能不会使用它提供的额外方法。建议根据应用程序的具体需求选择合适的接口。


Spring Data JPA中CrudRepository和JpaRepository接口的区别
https://119291.xyz/posts/2025-04-21.difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
作者
ww
发布于
2025年4月22日
许可协议