خصوصیت mappedBy برای annotation های OneToOne , OneToMany و ManyToMany وجود دارد و مشخص کننده سمتی است که صاحب یک رابطه نیست (non-owning side). در حقیقت mappedBy در کلاس Entity ی که صاحب رابطه نیست (non-owning) تعریف می شود و مقدار آن مشخص می کند متغییری است که از جنس این کلاس در کلاس صاحب رابطه (owning side) تعریف شده است چیست. JoinColumn در کلاس Entity صاحب رابطه تعریف می شود که کلید سمت دیگر رابطه را بعنوان کلید خارجی دارد).
رابطه OneToOne:
@Entity
public class Employee {
@Id
@Column(name="EMP_ID")
private long id;
...
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ADDRESS_ID")
private Address address;
...
}
---------------------------------------------------------------
@Entity
public class Address {
@Id
private long id;
...
@OneToOne(fetch=FetchType.LAZY, mappedBy="address")
private Employee owner;
...
}
رابطه OneToMany و ManyToOne:
@Entity
public class Employee {
@Id
@Column(name="EMP_ID")
private long id;
...
@OneToMany(mappedBy="owner")
private List<Phone> phones;
...
}
-------------------------------------------------------------
@Entity
public class Phone {
@Id
private long id;
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="OWNER_ID")
private Employee owner;
...
}
رابطه ManyToMany:
@Entity
public class Employee {
@Id
@Column(name="ID")
private long id;
...
@ManyToMany
@JoinTable(
name="EMP_PROJ",
joinColumns={@JoinColumn(name="EMP_ID", referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="PROJ_ID", referencedColumnName="ID")})
private List<Project> projects;
.....
}
--------------------------------------------------------------------------
@Entity
public class Project {
@Id
@Column(name="PROJ_ID")
private long id;
...
@ManyToMany(mappedBy="projects")
private List<Employee> employees;
...
}
وقتی که شما با استفاده از mappedBy سمت صاحب رابطه را مشخص کنید، پس از تغییر در لیست موجود در سمت صاحب رابطه و ذخیره آن تغییرات در هر دو سمت اعمال می شود:
Project p1 = new Project("p1");
p1 = projectDao.save(p1);
Employee e1 = new Employee("e1");
e1.setProjects(Arrays.asList(p1));
e1 = employeeDao.save(e1);
این در حالی است که بر عکس این کار تغییری در دیتابیس نمی دهد:
Employee e1 = new Employee("e1");
e1 = employeeDao.save(e1);
Project p1 = new Project("p1");
p1.setEmployees(Arrays.asList(e1));
p1 = projectDao.save(p1);