解读一个经典Entity(实体类) —— Spring MVC
代码片段展示了一个典型的Java实体类(Entity),这种类通常用于ORM(对象关系映射)框架(如 Hibernate、JPA)来将Java对象映射到数据库表。
@Entity:表示该类是一个JPA实体类;ORM框架会将该类映射到数据库中的表。
@Table:指定该实体类对应的数据库表名。
@JsonIgnoreProperties:用于Jackson序列化/反序列化时忽略不需要的属性,防止循环引用或无效字段的映射。
1. public final static String ACICODE = "ACI_CODE"; 等常量部分
public final static String ACICODE = "ACI_CODE"; ...
✅ 作用
- 这部分定义了一系列的常量,每个常量对应一个数据库的字段名。
- 通常在代码中,常量的作用是提高代码的可读性,避免"硬编码"。
- 在查询或构造SQL语句时,直接使用这些常量,避免直接写 "ACI_CODE" 这种字符串,减少拼写错误的可能性。
✅ 使用场景
- 可能会在查询、映射、校验等操作中使用。例如:
criteria.add(Restrictions.eq(ExOrder.ACICODE, "12345"));
这里直接使用ExOrder.ACICODE而不是写 "ACI_CODE",提高了代码的可维护性。
2. 中间@Column等部分的诸多注解
🔎 1. JPA(持久化)相关注解
这些注解来自于JPA(Java Persistence API),主要用于ORM 框架(如 Hibernate)中,负责将实体类映射到数据库表中。
✅ @Id
- 标识该字段为主键,等价于SQL中的PRIMARY KEY。
- 每个JPA实体类中必须要有一个@Id,否则ORM框架无法识别主键。
✅ @GeneratedValue(generator = "idGenerator")
- 指定该字段的主键生成策略。
- 通常用于自增主键、UUID、雪花算法等ID生成策略。
- generator = "idGenerator" 表示该主键生成器的名字,需要在配置文件或其他代码中定义。
- 常见的主键生成策略IDENTITY:数据库自增(如MySQL的AUTO_INCREMENT)。SEQUENCE:使用数据库的序列(如Oracle的SEQUENCE)。UUID:使用Java的UUID机制生成唯一标识。snowflake:使用雪花算法生成分布式唯一ID(在大数据项目中很常见)。
✅ @Generator("snowFlakeGenerator")
- 该注解并非JPA标准注解,可能是项目中的自定义注解,用于标明 ID 生成策略为“雪花算法”。
✅ @Column
- 将Java类的字段映射到数据库表的具体列。
- 常见属性:
- name:指定数据库列名。
- nullable:是否允许NULL值(默认为true)。
- length:字符串最大长度仅适用于VARCHAR等字段)。
- precision 和 scale:用于DECIMAL等数值类型字段,分别表示总位数和小数点位数。
- 示例:
@Column(name = "EI_TYPE", nullable = true, length = 50) private String eiType;
等价于:
EI_TYPE VARCHAR(50) NULL
🔎 2. 数据校验相关注解
这些注解通常与 Spring Boot的spring-boot-starter-validation、Hibernate Validator结合使用,负责在数据入库之前进行校验,提升数据的准确性和安全性。
✅ @RichLength(自定义注解)
- 该注解可能是项目中自定义的注解,作用类似于@Size,用于对字符串长度的约束。
- 常见参数:max:最大长度。min:最小长度。groups:指定校验分组。
- 通常与数据校验框架结合使用(如Hibernate Validator),控制字符串长度的上下限,确保数据有效性。
✅ @DateString(自定义注解)
- 可能是项目中的自定义注解,用于校验日期格式的正确性。
- 例如,ETA、ETD 可能要求符合 "yyyy-MM-dd" 格式。
🧩 替代方案(标准校验注解)
在标准的 javax.validation 中,常见的校验注解包括:
- @NotNull:字段不能为空。
- @Size(max = 50, min = 0):字符串长度限制。
- @Pattern(regexp = "\\d{4}-\\d{2}-\\d{2}"):指定日期格式校验。
- @Email:校验邮箱地址格式。
- @Positive / @Negative:校验数字的正负。
🔎 3. 特殊功能相关注解
✅ @Generator(自定义注解)
- @Generator("snowFlakeGenerator") 可能是用于指定雪花算法生成器的自定义注解。
- 这种注解一般在项目的工具类或ID生成器中定义。
✅ @VirtualColumn
- 该注解不是标准JPA注解,通常是项目中的自定义注解。
- 常用于非持久化字段,即该字段不映射到数据库表中。
- 例如,reprocessData可能是一个临时数据,只用于数据处理而非持久化。
- 示例:
@VirtualColumn private String tempData; // 非数据库字段,运行时使用
🔎 4. 文档注解
✅ /** 注释 **/
- 提供代码解释,帮助开发人员理解字段的用途。
- 在 IDE(如 IntelliJ、Eclipse)中可通过 /** + Enter 自动生成。
✅ @Deprecated
- 标注已废弃的方法或类,提示开发者不要再使用。
✅ @SuppressWarnings
- 抑制编译器警告,通常用于屏蔽非关键性提示。
3. Getter和Setter方法
public Date getCustCfmBillTime() { return custCfmBillTime; } public void setCustCfmBillTime(Date custCfmBillTime) { this.custCfmBillTime = custCfmBillTime; }
✅ 作用
- 这些方法是标准的Getter / Setter,用于获取和设置实体类的属性值。
- ORM框架在持久化数据时,必须通过Getter/Setter来访问和修改实体类中的属性(除非使用@Access等特殊配置)。
✅ 为什么要写这些方法?
- ORM 框架(如 Hibernate)在操作数据时,是通过反射机制调用这些方法的。
- 在代码逻辑中,外部类访问私有属性时,也依赖这些方法。
4. 这类实体类通常的生成方式
- 使用 IDE 自动生成IntelliJ IDEA、Eclipse 中的 “Generate” 功能可快速生成 Getter/Setter。
- 使用代码生成工具MyBatisX(快速生成 MyBatis 实体类、Mapper、Service)JPA Buddy(快速生成 JPA 实体类及 CRUD)
- 数据库逆向工程工具MyBatis Generator、JPA Model Generator 等可直接根据数据库表生成实体类。
5. 代码整体逻辑梳理
✅ 三部分结构总结
1.常量定义 (public static final):存储字段名,避免硬编码。
2.属性 (private String ...):真实映射数据库表中的字段,受 @Column 等注解管理。
3.Getter/Setter 方法:数据的读写接口,ORM 框架通过这些方法访问和更新数据。