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 获取。


原始标题:Difference Between @Size, @Length, and @Column | Baeldung