在使用JPA和Hibernate时,@Size、@Length和@Column(length=value)之间的区别是什么?

66

以下三个字段的验证检查有何不同之处?

@Entity
public class MyEntity {

    @Column(name = "MY_FIELD_1", length=13)
    private String myField1;
    @Column(name = "MY_FIELD_2")
    @Size(min = 13, max = 13)
    private String myField2;
    @Column(name = "MY_FIELD_3")
    @Length(min = 13, max = 13)
    private String myField3;

    // getter & setter

}

我看到第一个与DDL有关。第二个是用于bean-validation。第三个是用于hibernate-validation。

这正确吗?我仍然不明白的是:何时使用哪个?这些注释中的哪一个会触发?

编辑:考虑以下情况: 给定要开发一个具有长度为13的字符串类型字段的实体的要求。您会选择上述哪种方法?或者更好的问题是:您需要问自己哪些问题才能找出哪种方法适合您的目的?


2
列与验证无关。Size 是 JPA 标准,而 Length 则是专有的。从那里可以清楚地得出答案... @Size - Neil Stockton
长度是专有的?所以一般情况下我不能使用它? - Chris311
正如答案所说,它是一个特定于Hibernate的供应商扩展。除了那些没有理由想要将自己绑定到一个JPA实现的人之外,使用它没有任何意义。 - Neil Stockton
1个回答

123
  1. @Column是JPA注解,length属性用于由模式生成工具设置关联SQL列长度。
  2. @Size是Bean Validation注解,验证关联的字符串值的长度是否在最小值和最大值之间。
  3. @Length是Hibernate特定的注解,与@Size具有相同的含义。

因此,23都应该使用Bean Validation来验证String的长度。我会选择2,因为它比较通用。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Chris311
1
@Size 是通用的,由 JPA 定义。@Length 仅在 Hibernate 中可用。 - Vlad Mihalcea
23
@Size 并不是 JPA 注解,而是 Bean Validation API 注解。同时,更好的说法是 @Column 是 JPA 注解,只用于由所有 JPA 提供者生成数据库模式。 - Neil Stockton
有没有一种注解可以同时实现这两个功能?或者如果我想要Bean验证和DDL规范,我必须同时使用@Size和@Column这两个注解吗? - tmb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接