I am trying to understand the mappedBy
attribute of @OneToMany
annotation in JPA. I created below example where a Customer has a list of Orders:
Is normal this behavior mappedBy
indicates only that the entity in this side is the inverse of the relationship, and the owner resides in the "other" entity.
I suggest you this link
That's normal.
With the mappedBy
, you directly tell Hibernate/JPA that one table owns the relationship, and therefore it is stored as a column of that table.
Without, the relationship is external and Hibernate/JPA need to create another table to store the relationship.
Example:
Question
have several Answer
.Answer
is owned by one and only one Question
.In plain JDBC, you would create two table:
Questions(Question_ID, ...);
Answers(Answer_ID, Question_ID, ...);
Where Question_ID
is foreign key referencing Question.Question_ID
.
As for the other case, I don't have a real case since there are almost every time many to many with a unique constraint (eg: a Question
may have several Answer
, and Answer
may have physically have several Question
, but appears only once for any Question
).
A OneToMany
has two main ways it can be accomplished in the database.
If you leave a OneToMany
mapping and let it default, it will by default use a relation table, which is what you seem to want. If you don't want a join table to be used, you would either specify a JoinColumn
which sets up a foreign key relationship much like a OneToOne
, but in the opposite direction - it tells the provider what field in the target table points to this entity's primary key. But commonly the target foreign key is mapped in the target entity - it is a ManyToOne
after all - and so the mappedby
is used to specify that this OneToMany
should use the relationship already defined in the target entity.
In this case, mappedBy=customer
tells it to look at the customer
property mapping within the Order entity. There, it finds customer has a ManyToMany
mapping with a default joinColumn customer_id
that it also uses for the OneToMany
. Because it is already mapped within the Order entity, the OneToMany
is read-only. This ensures that should the two relationships be out of sync, JPA
has one side to always trust and use to set the database field.