胡文成的个人博客

Spring Data 核心概念

2024-09-08

一、核心概念

1、核心接口

SpringData中的存储库抽象层的核心接口是:Repository,它是用来管理领域类对象和使用域对象的标识符类型作为类型参数。

它是一个标记接口,用来捕获要工作的类型,以及帮助我们发现继承自该接口的接口

有两个继承的子接口:CrudRepositoryListCrudRepository,提供了操作实体的具体的功能方法。

1)CrudRepository 接口
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
39
40
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
// 保存指定实体。使用返回的实体对象进行后续操作
// 因为保存操作可能已经完全修改了实体对象
<S extends T> S save(S entity);

// 保存指定的所有实体
// 返回保存的所有实体对象
<S extends T> Iterable<S> saveAll(Iterable<S> entities);

// 根据ID查询指定实体对象
Optional<T> findById(ID id);

// 查询指定id的实体是否存在
boolean existsById(ID id);

// 查询所有实体对象
Iterable<T> findAll();

// 查询指定ID列表关联的实体对象列表
Iterable<T> findAllById(Iterable<ID> ids);

// 查询实体对象的总条数
long count();

// 删除ID关联的实体
void deleteById(ID id);

// 删除指定实体
void delete(T entity);

// 删除指定ID关联的实体
void deleteAllById(Iterable<? extends ID> ids);

// 删除指定实体列表
void deleteAll(Iterable<? extends T> entities);

// 删除所有实体
void deleteAll();
}
2)ListCrudRepository 接口

ListCrudRepository接口只是将CrudRepository中返回迭代对象的接口,换成了返回列表

1
2
3
4
5
6
7
8
9
10
11
@NoRepositoryBean
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID> {
// 保存所有实体
<S extends T> List<S> saveAll(Iterable<S> entities);

// 获取所有实体对象列表
List<T> findAll();

// 获取指定ID列表关联的实体列表
List<T> findAllById(Iterable<ID> ids);
}
3)PagingAndSortingRepository 和 ListPagingAndSortingRepository 接口
1
2
3
4
5
6
7
8
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends Repository<T, ID> {
// 查询所有实体, 并按照指定顺序排序
Iterable<T> findAll(Sort sort);

// 分页查询
Page<T> findAll(Pageable pageable);
}
1
2
3
4
5
@NoRepositoryBean
public interface ListPagingAndSortingRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
// 查询所有实体, 并按照指定顺序排序
List<T> findAll(Sort sort);
}
2、实体状态检测策略

下面是Spring Data提供的用来检测一个实体是不是新实体的策略

  • Id属性

    默认情况下,Spring Data通过实体的标识(@Id)来判断:如果标识是null0值,那么实体就会被认为是新实体,反之亦然。

  • @Version属性

    如果属性使用了@Version注解并且属性值为null ,或者版本属性值为0的情况下,那么实体会被认为是新实体;如果有版本属性注解且有一个不同的值,那么认为实体不是新实体;如果没有使用@Version注解,那么就会使用Id标识来进行判断

  • 实现Persistable接口

    如果实体实现了Persistable接口,Spring Data将会使用该接口的isNew()方法进行判断

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public interface Persistable<ID> {

    /**
    * Returns the id of the entity.
    *
    * @return the id. Can be {@literal null}.
    */
    @Nullable
    ID getId();

    /**
    * Returns if the {@code Persistable} is new or was persisted already.
    *
    * @return if {@literal true} the object is new.
    */
    boolean isNew();
    }
  • 自定义一个实现了EntityInformation接口的repository工厂类,然后覆盖其中的getEntityInformation()方法(一般不建议使用)

扫描二维码,分享此文章