JPA JoinColumn vs mappedBy
In a JPA entity mapping, the @JoinColumn annotation is used to specify the foreign key column for a many-to-one or one-to-one relationship. It is used on the side of the relationship that "owns" the foreign key.
For example, consider a Person entity that has a many-to-one relationship with a Department entity:
@Entity
public class Person {
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// ...
}In this example, the @JoinColumn annotation specifies that the Person entity has a foreign key column called department_id, which refers to the primary key of the Department entity.
On the other hand, the mappedBy attribute of the @OneToOne and @ManyToOne annotations is used to specify the inverse side of a one-to-one or many-to-one relationship. It is used on the side of the relationship that does not "own" the foreign key.
For example, consider the following entity mapping:
@Entity
public class Department {
@OneToOne(mappedBy = "department")
private Person person;
// ...
}In this example, the mappedBy attribute specifies that the Department entity is the inverse side of a one-to-one relationship with the Person entity, and that the foreign key is on the Person side of the relationship (as specified by the @JoinColumn annotation in the Person entity).
The @JoinColumn annotation is used to specify the foreign key column for the relationship, while the mappedBy attribute is used to specify the inverse side of the relationship.