The JPA (Java Persistence API) specification has 2 different ways to specify entity composite keys: @IdClass and @EmbeddedId.
I’m using both annotations on my mapped entities, but it turns out to be a big mess to people who aren’t very familiar with JPA.
I want to adopt only one way to specify composite keys. Which one is really the best? Why?
I consider that
@EmbeddedIdis probably more verbose because with@IdClassyou cannot access the entire primary key object using any field access operator. Using the@EmbeddedIdyou can do like this:This gives a clear notion of the fields that make the composite key because they are all aggregated in a class that is accessed trough a field access operator.
Another difference with
@IdClassand@EmbeddedIdis when it comes to write HQL :With
@IdClassyou write:and with
@EmbeddedIdyou have to write:You have to write more text for the same query. Some may argue that this differs from a more natural language like the one promoted by
IdClass. But most of the times understanding right from the query that a given field is part of the composite key is of invaluable help.