Is it possible to have immutable fields in Hibernate/JPA?

Carlos Melo picture Carlos Melo · Oct 29, 2011 · Viewed 12.6k times · Source

In our application, we need to have fields that are assignable only once.

At first we thought of encapsulating the fields and making the setters private. However, some questions arouse:

  • Without a public setter, is Hibernate still able to map the field from the database?
  • Can I strip out the setter and make the field mutable only in the entity constructor?
  • Finally, is there any standard JPA way to make a field immutable?

Thanks in advance.

Answer

Tomasz Nurkiewicz picture Tomasz Nurkiewicz · Oct 29, 2011
  • Ad. 1: I believe JPA uses plain private fields for both read and write if annotations are placed on fields and not on getters. Recently I discovered that Hibernate as an underlying JPA provider does not even need get*() and set*() methods at all. This was truly enlightening solution since from the beginning I thought Hibernate needs accessors. So the answer is: you don't need setters as far as Hibernate is concerned.

  • Ad. 2: However please note that Hibernate still needs no-arg constructor, otherwise it will fail to load entities with a descriptive exception. This is also a JPA requirement.

  • Ad. 3: No, there isn't. Remember that your collections would also had to be immutable.