1. Overview
In this quick tutorial, weβll take a look at JSR-330βs @Size annotation, Hibernateβs @Length annotation, and JPAβs @Columnβs length attribute.
At first blush, these may seem the same, but they perform different functions.
2. Origins
Simply put, all of these annotations are meant to communicate the size of a field.
@Size and @Length are similar. We can use either annotation to validate the size of a field. The former is a Java-standard annotation, while the latter is specific to Hibernate.
@Column, though, is a JPA annotation that we use to control DDL statements.
Now letβs go through each of them in detail.
3. @Size
For validations, weβll use @Size, a bean validation annotation. Weβll use the property middleName annotated with @Size to validate its value between the attributes min and max:
public class User {
// ...
@Size(min = 3, max = 15)
private String middleName;
// ...
}
Most importantly, @Size makes the bean independent of JPA and its vendors, such as Hibernate. As a result, itβs more portable than @Length.
4. @Length
As we previously mentioned, @Length is the Hibernate-specific version of @Size. Weβll enforce the range for lastName using @Length:
@Entity
public class User {
// ...
@Length(min = 3, max = 15)
private String lastName;
// ...
}
5. @Column(length=value)
@Column is quite different from the previous two annotations.
Weβll use @Column to indicate specific characteristics of the physical database column. Weβll use the length attribute of the @Column annotation to specify the string-valued column length:
@Entity
public class User {
@Column(length = 3)
private String firstName;
// ...
}
The resulting column will be generated as a VARCHAR(3), and trying to insert a longer string will result in an SQL error.
Note that weβll use @Column only to specify table column properties, as it doesnβt provide validations.
Of course, we can use @Column together with @Size to specify database column properties with bean validation:
@Entity
public class User {
// ...
@Column(length = 5)
@Size(min = 3, max = 5)
private String city;
// ...
}
6. Conclusion
In this article, we learned about the differences between the @Size annotation, @Length annotation, and @Columnβs length attribute. Then we examined each separately within the areas of their use.
