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 پاسخ 575 بازدید
0 امتیاز
1 پاسخ 268 بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 567 بازدید
0 امتیاز
1 پاسخ 398 بازدید
+2 امتیاز
2 پاسخ 574 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
2 پاسخ 607 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
+1 امتیاز
1 پاسخ 899 بازدید
سوال شده 4 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
+1 امتیاز
1 پاسخ 291 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
3 پاسخ 690 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
0 پاسخ 931 بازدید
...