lombok + @Entity

发布于:2025-02-10 ⋅ 阅读:(39) ⋅ 点赞:(0)

lombok

使用 Lombok 和 JPA 注解可以大大简化 Java 实体类的编写。这是一个完整的示例,展示如何将这些注解结合使用来定义一个 JPA 实体类。

示例类

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity  // 标识该类为 JPA 实体类,表示它将映射到数据库中的一个表
@Table(name = "test")  // 指定实体类映射的数据库表名为 test
@NoArgsConstructor  // 自动生成无参构造函数,无参构造函数是 JPA 要求的,因为 JPA 需要通过反射创建实体实例
@AllArgsConstructor  // 自动生成包含所有字段的构造函数,便于快速创建对象实例
@Getter  // 自动生成所有字段的 getter 和 setter 方法,简化属性访问
@Setter  // 自动生成所有字段的 getter 和 setter 方法,简化属性访问
@EqualsAndHashCode  // 自动生成 equals() 和 hashCode() 方法,默认使用所有非静态字段,确保对象比较和哈希计算的一致性
@ToString  // 自动生成 toString() 方法,输出对象的字符串表示,便于调试和日志记录
public class TestEntity {

    @Id  // 指定实体类映射的数据库表名为 test
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 标识主键字段
    private Long id;

    private String name;
    private int age;
    private String email;
}

解释

  • @Entity: 标识该类为 JPA 实体类,表示它将映射到数据库中的一个表。

  • @Table(name = "test"): 指定实体类映射的数据库表名为 test

  • @Id: 标识主键字段。

  • @GeneratedValue(strategy = GenerationType.IDENTITY): 指定主键生成策略为自增(通常用于 MySQL 等支持自增的数据库)。

  • @NoArgsConstructor: 自动生成无参构造函数,这是 JPA 要求的,因为 JPA 需要通过反射创建实体实例。

  • @AllArgsConstructor: 自动生成包含所有字段的构造函数,便于快速创建对象实例。

  • @Getter@Setter: 自动生成所有字段的 getter 和 setter 方法,简化属性访问。

  • @EqualsAndHashCode: 自动生成 equals()hashCode() 方法,默认使用所有非静态字段,确保对象比较和哈希计算的一致性。

  • @ToString: 自动生成 toString() 方法,输出对象的字符串表示,便于调试和日志记录。

  • @Data

    • 综合使用 @Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor

    • 适用于简单的 POJO 类。

    • import lombok.AllArgsConstructor;  
      import lombok.NoArgsConstructor;  
      import lombok.RequiredArgsConstructor;  
      
      @NoArgsConstructor // 生成无参构造函数  
      @AllArgsConstructor // 生成全参数构造函数  
      public class Product {  
          private Long id;  
          private String name;  
          private Double price;  
      }  
      
      @RequiredArgsConstructor // 为 final 和 @NonNull 字段生成构造函数  
      public class Order {  
          private final Long id; // final 字段  
          @NonNull private String orderNumber; // 标记为非空  
          private Double amount; // 不会包含在构造函数中  
      }
      
  • @Slf4j

    • 自动生成一个 org.slf4j.Logger 类型的日志记录器。
    • 也有其他日志框架的支持,如 @Log4j@Log 等。

使用示例

public class Main {
    public static void main(String[] args) {
        // 使用全参构造函数创建对象
        TestEntity testEntity = new TestEntity(1L, "John Doe", 30, "john.doe@example.com");

        // 使用 setter 方法修改属性
        testEntity.setName("Jane Doe");

        // 打印对象信息
        System.out.println(testEntity);

        // 使用 getter 方法获取属性
        System.out.println("Name: " + testEntity.getName());

        // 比较两个对象
        TestEntity anotherEntity = new TestEntity(1L, "Jane Doe", 30, "john.doe@example.com");
        System.out.println("Are entities equal? " + testEntity.equals(anotherEntity));
    }
}

注意事项

  • JPA 要求: 确保实体类有一个无参构造函数,这是 JPA 实体类的基本要求。
  • 主键生成策略: 根据数据库和需求选择合适的主键生成策略。GenerationType.IDENTITY 是常用的策略之一。
  • 字段选择: 可以通过 @EqualsAndHashCode@ToString 的属性来选择哪些字段参与计算或输出。
  • 敏感信息: 确保不在 toString() 方法中包含敏感信息(如密码、密钥等),以防止在日志中泄露。
  • 避免过度使用
    • 不要在所有类上都使用 @Data
    • 注意 @EqualsAndHashCode 在继承关系中的使用
    • 谨慎处理循环依赖
  • 最佳实践
    • 对于 JPA 实体,建议显式指定 @EqualsAndHashCode
    • 敏感字段使用 @ToString.Exclude
    • 使用 @Builder 时考虑是否需要 @NoArgsConstructor

实体类示例

javaimport lombok.*;  

@Data  
@Builder  
@NoArgsConstructor  
@AllArgsConstructor  
@ToString(exclude = "password")  
@EqualsAndHashCode(of = {"id", "email"})  
public class UserAccount {  
    private Long id;  
    private String username;  
    private String email;  
    private String password;  
    private boolean active;  
    private LocalDateTime createdAt;  
    
    @Builder.Default  
    private List<String> roles = new ArrayList<>();  
}  

JPA 实体类示例

javaimport lombok.*;  
import javax.persistence.*;  

@Entity  
@Table(name = "users")  
@Data  
@NoArgsConstructor  
@AllArgsConstructor
@EqualsAndHashCode(exclude = {"updatedAt"}) // 排除某些字段 
@Builder  
public class UserEntity {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
    
    @Column(nullable = false, unique = true)  
    private String username;  
    
    @Column(nullable = false)  
    private String email;  
    
    @ToString.Exclude // 在 toString 方法中排除密码  
    private String password;  
    
    @Builder.Default  
    private boolean active = true;  
    
    @Column(name = "created_at")  
    private LocalDateTime createdAt;  
    
    @Column(name = "updated_at")  
    private LocalDateTime updatedAt;  
    
}  

通过结合使用这些 Lombok 和 JPA 注解,可以大大简化实体类的编写,提高代码的可读性和维护性。


Lombok 是一个 Java 库,通过注解的方式帮助开发者减少样板代码(boilerplate code)的编写。它可以自动生成常用的代码,如构造函数、getter/setter 方法、equals()hashCode() 方法等,从而提高开发效率和代码可读性。

使用 Lombok

  1. 添加依赖

    • 在 Maven 项目中,添加 Lombok 依赖到 pom.xml
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.28</version>
          <scope>provided</scope>
      </dependency>
      
    • 在 Gradle 项目中,添加 Lombok 依赖到 build.gradle
      dependencies {
          compileOnly 'org.projectlombok:lombok:1.18.28'
          annotationProcessor 'org.projectlombok:lombok:1.18.28'
      }
      
  2. IDE 支持

    • 确保你的 IDE 安装了 Lombok 插件,以便正确识别和处理 Lombok 注解。

通过使用 Lombok,可以显著提高 Java 开发的效率和代码质量,尤其是在处理大量数据类时。


网站公告

今日签到

点亮在社区的每一天
去签到