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.

As always, the full source code of the examples is available over on GitHub.