关于 spring-data-jpa
用于使用 Spring Data JPA 构建持久化层的技能,涵盖实体、仓库、查询、配置和事务。面向实现数据库访问的 Spring 开发者,也介绍分页、审计及规避常见抓取问题。
主要功能
- 01定义 JPA 实体和关系映射
- 02创建 Spring Data 仓库
- 03编写派生、JPQL 和原生查询
- 04配置数据源与事务
- 05使用分页、排序和实体图
适用场景
- 01为 Spring 应用实现数据库访问
- 02添加分页或自定义仓库查询
- 03检查事务边界和抓取策略
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill spring-data-jpa安装后在 Claude Code 中输入/spring-data-jpa确认已加载。
附带文件LICENSE.txt
详细介绍
适用场景
在用户希望执行以下操作时使用此技能:
- 使用注解(@Entity、@Id、@Column)定义 JPA 实体
- 创建 Spring Data 仓库(JpaRepository、CrudRepository)
- 使用派生查询方法、通过 @Query 编写 JPQL/原生 SQL,以及使用 Specifications
- 配置数据源、Hibernate 方言和事务管理
- 处理分页、排序、审计和实体图
使用方法
工作流
- 定义实体,使用 JPA 注解和关系映射
- 创建仓库,扩展 JpaRepository 并添加派生查询方法或自定义查询方法
- 配置数据源,在
application.yml或application.properties中进行配置 - 使用服务层封装业务逻辑,并设置恰当的事务边界
1. 实体定义
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
@CreatedDate
private LocalDateTime createdAt;
// Getters and setters
}
2. 仓库
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String name);
Page<User> findByNameContaining(String name, Pageable pageable);
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmailCustom(@Param("email") String email);
}
3. 使用事务的服务层
@Service
@Transactional
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User create(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user);
}
@Transactional(readOnly = true)
public Page<User> search(String name, Pageable pageable) {
return userRepository.findByNameContaining(name, pageable);
}
}
4. 配置
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: password
jpa:
hibernate:
ddl-auto: validate
show-sql: false
properties:
hibernate.format_sql: true
最佳实践
- 注意 N+1 查询问题;使用
@EntityGraph或JOIN FETCH控制抓取策略 - 对大型数据集使用分页(
Pageable)和批量操作 - 将实体与 DTO 分开;切勿在 API 响应中直接暴露 JPA 实体
- 明确划分事务边界;对读取操作使用
@Transactional(readOnly = true) - 使用 Flyway 或 Liquibase 进行架构迁移,避免在生产环境中使用
ddl-auto: update
资源
- 官方文档:https://spring.io/projects/spring-data-jpa
- 参考指南:https://docs.spring.io/spring-data/jpa/reference/
关键词
spring data jpa,JPA,Repository,实体,查询方法,JPQL,分页,事务,Hibernate,Spring Boot,持久化
评论
支持 Markdown