@DynamicUpdate 注解 动态更新 和 lombok 插件 @Data 注解使用 ; @Transient 与Dto引入

博客围绕JPA实体类注解展开。提到数据库中`update_Time`字段自动赋值时间,但用JPA主键查询改名后该字段未更新,加注解可解决;介绍了@Data注解,引入lombok坐标可省略set、get方法;还提及@Transient注解,不过建议用DTO数据传输对象来关联表。

比如在实体类中  private Date updateTime ; 这个属性  在数据库中 我们创建update_Time的时候我们 

`update_Time` timestamp  not null  default current_timestamp on update current_timestamp  comment ‘我们每一次就改数据库 该字段自动赋值当前的时间 ’;

 

那么问题就来了? 

 

    @Test
    public  void testFindOne (){
      ProductCategory  pc =  productCategoryRepository.findOne( 1);
      pc.setCategoryName("销售排行榜");
      productCategoryRepository.save(pc);
    }

这里用的JPA 我们 通过主键查询出来之后并且改名为销售排行榜 我们会发现 运行之后CateogoryName是改变了,但是updata_time并没有改变 。  

加上这个注解的话 就可以改变。

 

第二  @Data 注解

引入lombok 这个 坐标 

这是一个岛屿的名字 , 这个jar非常使用 只需在实体类名上面直接使用@Data 注解 就可以省略set get  方法 

注意 用 idea的话需要在设置中 下载找lombok这个插件  

 

第三注解: 

@Transient  : 如果你的实体类中从新添加一个字段 如果说我们订单主表 和订单详情表 一对多关系,我们订单主表的实体类为了方便快捷的与订单详情表做上关联 那么我们在可以在订单主表加List<OrderDetail>  orderDetailList  ;  这个字段与之关联

那么数据库没有这个字段 肯定会报错的 , 我们只需要在这个字段上面写上@Transient这个字段就可以了 。 直接看粗字体就可。  这样做可以 但是不完美   我们不才用这个注解来达到我们的目的 我们创建DTO DTO(Data Transfer Object):数据传输

来达到我们的目的。

 

 

 

 

 

<think>我们正在讨论Java中的注解,特别是Lombok库中的@Data注解。 回答:@Data注解Lombok库提供的一个组合注解,用于自动生成Java类的样板代码(boilerplate code)。 详细解释: 在Java开发中,我们经常需要为类的属性编写getter、setter、toString、equalshashCode等方法。这些方法重复且繁琐,而Lombok通过注解自动生成这些代码,减少手动编写,使代码更简洁。 @Data注解的作用: 它等价于同时使用以下注解: - @Getter:为所有非静态字段生成getter方法。 - @Setter:为所有非final字段生成setter方法。 - @ToString:生成toString方法。 - @EqualsAndHashCode:生成equalshashCode方法。 - @RequiredArgsConstructor:生成一个包含所有未初始化的final字段标记为@NonNull的字段的构造方法。 注意:从Lombok 1.18.16版本开始,@Data不再包含@RequiredArgsConstructor,除非显式添加。 示例代码: 假设有一个User类,我们使用@Data注解。 在没有Lombok的情况下,我们需要编写大量样板代码。使用Lombok后,代码将变得非常简洁。 使用@Data注解的类: ```java import lombok.Data; @Data public class User { private Long id; private String name; private String email; } ``` 上述代码等同于以下传统代码: ```java public class User { private Long id; private String name; private String email; 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(email, user.email); } @Override public int hashCode() { return Objects.hash(id, name, email); } } ``` 使用@Data的好处: 1. 减少样板代码,提高开发效率。 2. 代码更简洁,易于阅读维护。 3. 自动生成的equalshashCode方法基于所有非静态、非transient字段,确保正确性。 注意事项: 1. 需要安装Lombok插件(IDE支持)并在项目中添加Lombok依赖。 2. 在某些情况下,可能需要自定义行为(如排除某些字段),可以通过额外的注解实现,例如: - @ToString.Exclude:排除字段在toString方法中输出。 - @EqualsAndHashCode.Exclude:排除字段在equalshashCode方法中。 3. 如果类有继承关系,注意@EqualsAndHashCode可能需要设置callSuper属性,以包含父类的字段。 示例:自定义排除字段 ```java @Data public class User { private Long id; private String name; @ToString.Exclude // 在toString方法中排除该字段 private String password; // 密码不应该在toString中输出 } ``` 依赖配置(Maven): ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <!-- 使用最新版本 --> <scope>provided</scope> </dependency> ``` 总结:@Data注解Lombok库中的一个强大工具,它通过自动生成常用方法,极大地简化了Java模型类(如POJO)的编写。 §§相关问题§§: 1. Lombok中除了@Data注解,还有哪些常用注解? 2. 如何在使用@Data注解时,自定义equalshashCode方法的行为? 3. 在IDE中使用Lombok需要注意哪些配置? 4. 为什么有些项目不建议使用Lombok? </think>### `@Data` 注解详解 `@Data` 是 **Lombok 库**中的一个核心注解,用于自动生成 Java 类的样板代码(boilerplate code)。它会为类自动生成以下方法: 1. 所有字段的 **Getter** 2. 所有非 final 字段的 **Setter** 3. **`toString()`** 方法 4. **`equals()`** **`hashCode()`** 方法 5. **无参构造器**(如果类中没有其他构造器) --- ### 代码示例解释 #### 1. 使用 `@Data` 的类 ```java import lombok.Data; @Data public class User { private Long id; private String name; private String email; } ``` #### 2. Lombok 自动生成的等效代码 ```java public class User { private Long id; private String name; private String email; // 自动生成的 Getter public Long getId() { return id; } public String getName() { return name; } public String getEmail() { return email; } // 自动生成的 Setter(非 final 字段) public void setId(Long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setEmail(String email) { this.email = email; } // 自动生成的 toString() @Override public String toString() { return "User(id=" + id + ", name=" + name + ", email=" + email + ")"; } // 自动生成的 equals() hashCode() @Override public boolean equals(Object o) { // 实现基于字段值的比较逻辑 } @Override public int hashCode() { // 实现基于字段值的哈希计算 } // 自动生成的无参构造器 public User() {} } ``` --- ### 关键特性详解 1. **依赖管理** 需要在项目中添加 Lombok 依赖: ```xml <!-- Maven 依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <!-- 使用最新版本 --> <scope>provided</scope> </dependency> ``` 2. **IDE 支持** 需在 IDE 中安装 Lombok 插件(如 IntelliJ 的 `Lombok Plugin`),否则编译通过但 IDE 会报错。 3. **其他 Lombok 注解的协作**: ```java @Data @AllArgsConstructor // 生成全参构造器 @NoArgsConstructor // 显式声明无参构造器(@Data 默认生成) public class Product { private final String sku; // final 字段不会生成 setter private Double price; } ``` 4. **注意事项**: - **继承问题**:`equals()`/`hashCode()` 默认仅包含当前类字段(可通过 `@EqualsAndHashCode(callSuper=true)` 包含父类字段) - **敏感字段**:可用 `@ToString.Exclude` 排除特定字段的 `toString()` 输出 - **不可变对象**:如需不可变对象,建议使用 `@Value` 代替(生成全 final 字段 + getter) --- ### 使用场景对比 | **场景** | **无 Lombok** | **使用 `@Data`** | |------------------------|---------------------------------------------------|---------------------------------------------| | 字段修改 | 需手动添加/删除 getter/setter | 增删字段自动同步方法 | | 添加 `toString()` | 需手动编写并维护字段 | 自动生成完整实现 | | 对象比较 | 需手动实现易出错的 `equals()`/`hashCode()` | 自动生成符合规范的实现 | | 类行数 | 通常 50+ 行 | 约 5 行 | | 维护成本 | 高(字段变更需同步多个方法) | 零维护 | --- ### 替代方案 1. **手动编写**:传统方式,易出错且冗长 2. **IDE 生成**:右键生成代码,但字段变更后需重新生成 3. **记录类(Java 14+)**: ```java public record User(Long id, String name, String email) {} ``` - 自动生成 final 字段 + 全参构造器 + getter + `equals()`/`hashCode()`/`toString()` - 但**不支持 setter**(不可变对象) --- ### 最佳实践 1. 在 **DTO、POJO、配置类** 中使用 `@Data` 2. **避免** 在 JPA Entity 中使用(可能破坏懒加载) 3. 对敏感字段添加排除注解: ```java @Data public class Credentials { private String username; @ToString.Exclude // 避免日志泄露密码 private String password; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值