I am confused as everywhere it is mentioned to use @GenerateValue only with @Id.
But: can it be used with non primary key attributes?
I am confused as everywhere it is mentioned to use @GenerateValue only with @Id.
But: can it be used with non primary key attributes?
The JPA specification document provides an important hint that you should not do so, see section 11.1.20, on page 449:
Footnote [110]: Portable applications should not use the GeneratedValue annotation on other persistent fields or properties.
Here, ”other“ refers to fields or properties of an Entity that are not annotated with @Id:
The
GeneratedValueannotation may be applied to a primary key property or field of an entity or mapped superclass in conjunction with theIdannotation.
Hence, I would conclude that most, if not all, persistence provider implementations might not support your intended (special) use case.
As per documentation as well as hibernate documentation though this annotation is specifically aimed for simple primary keys (as its elements are used to define primary key generator & strategy), I think you can still use this for non-primary key field provided you are not using any elements of this annotation.
But if you think of using generated value for non-primary key field, fetching records will be slower using this column as your predicate/ where clause.
In that case, you might need to impose index from database. So using GeneratedValue for non-primary key may not be good practice.