1. 概述
在实际开发中,我们经常会用到 @Size
、@Length
和 @Column(length = N)
这三个注解。虽然它们看起来都是用来控制字符串长度的,但它们的作用范围和使用场景完全不同。
本文将简要介绍它们之间的区别,帮助你在不同场景下选择合适的注解。
2. 注解来源与作用
注解 / 属性 | 来源 | 用途 |
---|---|---|
@Size |
javax.validation.constraints.Size |
Bean Validation,用于运行时数据校验 |
@Length |
org.hibernate.validator.constraints.Length |
Hibernate Validator 提供,功能类似 @Size |
@Column(length = N) |
javax.persistence.Column |
JPA 注解,用于定义数据库字段长度 |
简单来说:
@Size
是标准的 Bean Validation 注解,不依赖任何 ORM 框架;@Length
是 Hibernate 特有的校验注解;@Column(length = N)
则是用于数据库建模,控制数据库字段的长度限制。
3. @Size
@Size
是 Java Bean Validation 的标准注解,支持对字符串长度、集合大小等进行校验。适用于 Spring MVC、Spring Boot 等支持 Bean Validation 的场景。
✅ 优点: 与 ORM 框架无关,可移植性强
✅ 适用场景:DTO、VO 等非实体类校验
示例代码:
public class User {
// ...
@Size(min = 3, max = 15)
private String middleName;
// ...
}
这个注解会在运行时校验 middleName
的长度是否在 3 到 15 之间,超出范围会抛出异常。
4. @Length
@Length
是 Hibernate Validator 提供的注解,功能与 @Size
类似,但仅适用于 Hibernate 环境,也就是说你必须使用 Hibernate 做为 Bean Validation 的实现。
⚠️ 注意: 它不是标准的 JSR 380 注解,所以可移植性不如 @Size
示例代码:
@Entity
public class User {
// ...
@Length(min = 3, max = 15)
private String lastName;
// ...
}
使用 @Length
同样可以校验字段长度,但它是 Hibernate 特有的。如果你换用其他校验框架,可能会出问题。
5. @Column(length = N)
@Column
是 JPA 的注解,用来定义数据库表字段的元信息。length
属性用于指定字段长度,仅影响数据库结构,不提供运行时校验。
✅ 作用: 控制 DDL(建表语句)中字段的长度限制
❌ 缺点: 不做数据校验,插入超长内容会直接报 SQL 错误
示例代码:
@Entity
public class User {
@Column(length = 3)
private String firstName;
// ...
}
这段代码会在数据库中生成 VARCHAR(3)
类型的字段,插入超过 3 个字符的内容会抛出 SQL 异常。
同时使用 @Size
与 @Column
推荐在实体类中同时使用 @Size
和 @Column
,一个负责校验,一个负责建表:
@Entity
public class User {
@Column(length = 5)
@Size(min = 3, max = 5)
private String city;
// ...
}
这样可以做到:
- 数据库字段长度可控(
@Column
) - 插入前做校验,避免数据库报错(
@Size
)
6. 总结
注解 / 属性 | 校验 | ORM 依赖 | 影响数据库 |
---|---|---|---|
@Size |
✅ | ❌ | ❌ |
@Length |
✅ | ✅(Hibernate) | ❌ |
@Column(length = N) |
❌ | ✅(JPA) | ✅ |
使用建议:
- DTO、VO 等非实体类使用
@Size
- Hibernate 环境下的实体类可以使用
@Length
(但更推荐用@Size
) - 实体类上一定要使用
@Column(length = N)
来控制数据库字段长度 - 推荐组合使用
@Size + @Column
,兼顾校验和建模
这样写出来的代码既规范又健壮,避免踩坑。
7. 参考资料
完整示例代码可在 GitHub 获取。