Skip to content

JPA 插件

lcgyl-jpa-plugin 提供 JPA/Hibernate ORM 集成,支持实体映射、审计字段、分页查询等功能。

特性

  • ✅ JPA 2.2 / Hibernate 6.x 支持
  • ✅ 实体基类(BaseEntity)
  • ✅ 审计字段自动填充
  • ✅ Repository 基类
  • ✅ Service 基类
  • ✅ 分页查询

快速开始

1. 添加依赖

gradle
dependencies {
    implementation project(':plugins:data-access:lcgyl-jpa-plugin')
    runtimeOnly 'org.postgresql:postgresql'  // 或其他数据库驱动
}

2. 配置数据源

yaml
lcgyl:
  jpa:
    datasource:
      url: jdbc:postgresql://localhost:5432/mydb
      username: postgres
      password: postgres
    hibernate:
      ddl-auto: update
      show-sql: true

3. 定义实体

java
import com.lcgyl.data.jpa.entity.BaseEntity;
import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User extends BaseEntity<Long> {
    
    @Column(nullable = false, length = 50)
    private String name;
    
    @Column(unique = true)
    private String email;
    
    // getters/setters
}

4. 创建 Repository

java
import com.lcgyl.data.jpa.repository.BaseRepository;
import java.util.Optional;

public interface UserRepository extends BaseRepository<User, Long> {
    
    Optional<User> findByEmail(String email);
    
    List<User> findByNameContaining(String name);
}

5. 创建 Service

java
import com.lcgyl.data.jpa.service.BaseService;
import org.springframework.stereotype.Service;

@Service
public class UserService extends BaseService<User, Long> {
    
    private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Override
    protected BaseRepository<User, Long> getRepository() {
        return userRepository;
    }
    
    public User findByEmail(String email) {
        return userRepository.findByEmail(email).orElse(null);
    }
}

实体基类

BaseEntity

提供通用的实体字段和审计功能:

java
@MappedSuperclass
public abstract class BaseEntity<ID> {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private ID id;
    
    @Column(name = "created_at")
    private LocalDateTime createdAt;
    
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
    
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }
    
    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }
}

Service 基类

BaseService 提供常用的 CRUD 操作:

java
// 保存
User user = userService.save(new User("张三"));

// 根据 ID 查询
User user = userService.findById(1L);

// 查询所有
List<User> users = userService.findAll();

// 分页查询
Page<User> page = userService.findAll(PageRequest.of(0, 10));

// 删除
userService.deleteById(1L);

// 批量保存
userService.saveAll(List.of(user1, user2, user3));

分页查询

java
// 创建分页请求
Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending());

// 分页查询
Page<User> page = userRepository.findAll(pageable);

// 获取结果
List<User> content = page.getContent();
long total = page.getTotalElements();
int totalPages = page.getTotalPages();

自定义查询

java
public interface UserRepository extends BaseRepository<User, Long> {
    
    // 方法名查询
    List<User> findByStatus(String status);
    
    // JPQL 查询
    @Query("SELECT u FROM User u WHERE u.email LIKE %:keyword%")
    List<User> searchByEmail(@Param("keyword") String keyword);
    
    // 原生 SQL
    @Query(value = "SELECT * FROM users WHERE created_at > :date", nativeQuery = true)
    List<User> findRecentUsers(@Param("date") LocalDateTime date);
}

事务管理

java
@Service
@Transactional
public class UserService extends BaseService<User, Long> {
    
    @Transactional(readOnly = true)
    public User findByEmail(String email) {
        return userRepository.findByEmail(email).orElse(null);
    }
    
    @Transactional(rollbackFor = Exception.class)
    public void transfer(Long fromId, Long toId, BigDecimal amount) {
        // 事务操作
    }
}

下一步

Released under the Apache License 2.0