Difference between @Size, @Length and @Column(length=value) when using JPA and Hibernate

JavaHibernateValidationJpaOrm

Java Problem Overview


What is the difference between the validation check of the following three fields?

@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

}

I read that the first one has to do with DDL stuff. The second is for bean-validation. The third is for hibernate-validation.

Is that correct? What I still don't understand is: When do I have to use which one? When does one of these annotations trigger?

Edit: Think of the following situation: Given the requirement to develope an entity with a field of type string with length 13. Which of above mentioned methods would you choose? Or even better: Which questions do you have to ask yourself to find out which one suits your purposes?

Java Solutions


Solution 1 - Java

  1. @Column is a JPA annotation and the length attribute is used by the schema generation tool to set the associated SQL column length.
  2. @Size is a Bean Validation annotation that validates that the associated String has a value whose length is bounded by the minimum and maximum values.
  3. @Length is a Hibernate-specific annotation and has the same meaning as @Size

So both 2. and 3. should validate the String length using Bean Validation. I'd pick 2. because it's generic.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChris311View Question on Stackoverflow
Solution 1 - JavaVlad MihalceaView Answer on Stackoverflow