Field access allows code to distinguish between the JPA provider setting properties while loading an entity versus application code setting a property.
This was very useful for a project that I'm involved with that has de-normalized data or other fields that are computed and persisted. Here's how it works:
- In the setter for various properties that affect the computation of a de-normalized property, the value of the de-normalized property is set to null. @AccessType(FIELD) is used for these properties.
- In the getter for the de-normalized property, if the value is null the de-normalized value is recomputed.
- In a @PrePersist method, the getter is called to ensure that the de-normalized value is properly persisted.
Using this technique maintaining de-normalized data becomes simple and robust.
While this feature has been available within Hibernate since 3.0, I'm glad to see that JPA 2.0 (JSR 317) introduces a standard annotation to control this behaviour.