0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
کاربرد خصوصیت mappedBy در روابط بین Entity ها در JPA چیست؟

1 پاسخ

+2 امتیاز
قبل توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

خصوصیت 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);

سوالات مشابه

0 امتیاز
1 پاسخ 708 بازدید
0 امتیاز
1 پاسخ 372 بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 709 بازدید
0 امتیاز
1 پاسخ 497 بازدید
+2 امتیاز
2 پاسخ 835 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
2 پاسخ 880 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
+1 امتیاز
1 پاسخ 1.1هزار بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
+1 امتیاز
1 پاسخ 385 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
3 پاسخ 850 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
0 پاسخ 2.8هزار بازدید
...