I am confused over working on @JoinColumn and @MappedBy.
Consider following example Here is my Department class with unidirectional relationship
@Entity
@Table(name = "DEPARTMENT")
public class Department {
@Id
@Column(name = "DEPARTMENT_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer departmentId;
@Column(name = "DEPARTMENT_NAME")
private String departmentName;
@Column(name = "LOCATION")
private String location;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "DEPARTMENT_ID")
private List<Employee> employees = new ArrayList<>();
}
I have a list of employees in Department class over which I have specified @JoinColumn so it will add department_id FK in employee table.
but with bidirectional relationship I will define the classes like
Department.java
@Entity
@Table(name = "DEPARTMENT")
public class Department {
@Id
@Column(name = "DEPARTMENT_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer departmentId;
@Column(name = "DEPARTMENT_NAME")
private String departmentName;
@Column(name = "LOCATION")
private String location;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "department")
private List<Employee> employees = new ArrayList<>();
}
Employee.java
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@SequenceGenerator(name = "emp_seq", sequenceName = "seq_employee")
@GeneratedValue(generator = "emp_seq")
@Column(name = "EMPLOYEE_ID")
private Integer employeeId;
@Column(name = "EMPLOYEE_NAME")
private String employeeName;
@ManyToOne
@JoinColumn(name = "DEPARTMENT_ID")
private Department department;
}
but with bidirectional relationship why do I need to place @JoinColumn over department in Employee class and write @MappedBy over list of employees in Department class?
so how does @MappedBy and @JoinColumn works?
Actually, seems you're not using @MappedBy annotation but mappedBy = "department" in @OneToMany.
In simple words, mappedBy tells to hibernate that key of relationship is on the other table (class in this case).
Think on this: usually when you link 2 tables in any DB System, just 1 of those has the foreign key constraint to the other one right?
What MappedBy allows you to link from the table not containing the constraint to the other table.
About @JoinColumn it's easier, here you have in table foreign key, so you tell hibernate this is not only a column, but a column that must join a table.
The join column is declared with the
@JoinColumnannotation which looks like the@Columnannotation. It has one more parameters named referencedColumnName. This parameter declares the column in the targeted entity that will be used to the join. Note that when using referencedColumnName to a non primary key column, the associated class has to be Serializable. Also note that the referencedColumnName to a non primary key column has to be mapped to a property having a single column (other cases might not work).
Find HERE hibernate mapping documentations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With