توسعهدهنده بکاند جاوا، علاقهمند به تکنولوژیهای مبتنی بر بلاکچین، به دنبال موقعیت شغلی مناسب
رهیافتی بر ORM در Hibernate
سلام تو این پست قصد دارم در مورد (نگاشت اشیا به مدل رابطه ای با استفاده از Hibernate ) توضیحاتی خدمتتون بدهم امیدوارم که براتون مفید واقع بشه...
یکی از چالش های زبان های برنامه نویسی شی گرا برای کار با پایگاه داده های رابطه ای نگاشت اشیا به داده ها در جداول می باشد این مشکل به دلیل از ساختار متفاوت مدل رابطه ای و شی گرایی حاصل میشه برای درک بهتر مثال زیر رو در نظر میگیریم:
فرض کنید کلاسی داریم با نام Student که دارای داده های (نام, نام خانوادگی, سن , شماره دانشجویی) می باشد به راحتی میتوانیم کلاس فوق را به جدولی به صورت زیر نگاشت کنیم:
CREATE table student(
name varchar(20),
last_name varchar(20),
age Integer,
id Integer PRIMARY key
);
خب این که کاری نداشت!؟
مشکل اصلی وقتی هست که کلاس Student ما به یک سری از کلاس های دیگر وابستگی داشته باشد. مثال زیر را در نظر بگیرید:
مدلی رابطه ای طراحی کنید که شامل موجودیت های زیر باشد:
1. دانشجو:
شامل نام، نام خانوادگی، سن، شناسه، کارت دانشجویی، گروه آموزشی و لیست دروس اخذ شده
2. کارت دانشجویی:
شامل تاریخ صدور و Serial Number
3. گروه آموزشی
شامل نام، شناسه، دانشجویان
4. درس
شامل نام درس، شناسه درس، تعداد واحد و لیست دانشجویان اخذ کننده درس
و روابط به صورت زیر باشند:
هر دانشجو فقط و فقط یک کارت دانشجویی دارد
هر کارت دانشجویی فقط و فقط به یک دانشجو تعلق دارد
هر تعداد دانشجو فقط و فقط در یک گروه عضویت دارند
هر گروه شامل چندین دانشجو می باشد
هر دانشجو تعدادی از دروس را اخذ کرده است
هر درس به وسیله تعدادی دانشجو اخذ شده است
همونطور که می بینید نگاشت این موجودیت ها به سادگی مثال قبل نمی باشند. اینجاست که ما میتوانیم با استفاده از ORM مبتنی بر Hibernate بدون هیچ نیازی از دانش اولیه به مدل رابطه ای، پایگاه داده خودمون رو طراحی کنیم.
با استفاده از Hibernate و استاندارد JPA می توانیم مدل خود را به صورت شی گرا طرحی کرده و نگاشت به مدل رابطه ای را به خود Hibernate واگذار کنیم. JPA انوتیشن هایی برای انواع روابط تعریف کرده که به بیان آن ها می پردازیم و سپس آن ها را در هدف خود به کار میبریم:
@OneToOne
این انوتیشن برای مواقعی استفاده میشود که رابطه ما از نوع یک به یک باشد مثلا روابط:
هر دانشجو فقط و فقط یک کارت دانشجویی دارد
هر کارت دانشجویی فقط و فقط به یک دانشجو تعلق دارد
با انوتیشن OneToOne مشخص میشوند
2. @OneToMany
بیانگر رابطه یک به چند می باشد مثال زیر آن را به خوبی بیان میکند:
هر گروه شامل چندین دانشجو می باشد
3. @ManyToOne
رابطه چند به یک:
هر تعداد دانشجو فقط و فقط در یک گروه عضویت دارند
4. @ManyToMany
رابطه چند به چند که مشابه رابطه یک به یک، دوطرفه است. در حقیقت هر کدام از مثال های زیر به تنهایی معنای (یک به چند) میدهند ولی در کنار هم بیانگر چند به چند هستند :
هر دانشجو تعدادی از دروس را اخذ کرده است
هر درس به وسیله تعدادی دانشجو اخذ شده است
پیاده سازی
برای پیاده سازی مدل رابطه ای در مثال اصلی این پست، کافی است آن را به صورت شی گرا طراحی کرده و با استفاده از انوتیشن های ذکر شده روابط بین آن ها را بیان کنیم پس به شکل زیر پیاده سازی داده ها را انجام می دهیم:
- برای دانشجو
@Entity
public class Student {
@Id
private int id;
@Column
private String name;
@Column(name = "last_name")
private String lastName;
@Column
private int age;
@OneToOne
@JoinColumn(name = "student_card")
private StudentCard studentCard;
@ManyToOne
@JoinColumn(name = "group_id")
private GrouB groub;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courseList;
...
}
- کارت دانشجویی
@Entity
@Table(name = "stdeunt_card")
public class StudentCard {
@Id
private int serialNumber;
@Column
private Date IssueDate;
@OneToOne(mappedBy = "studentCard")
private Student student;
...
}
- گروه
@Entity
@Table
public class GrouB {
@Id
private int id;
@Column
private String name;
@OneToMany(mappedBy = "groub")
private List<Student> studentList;
...
}
فقط برای این کلاس نکته ای که داریم اینه که سعی کنید نام هایی که برای کلاس یا فیلد ها انتخاب میکنید جزو کلمات رزرو شده SQL نباشند!(با خطای Syntax مواجه میشوید)
- درس
@Entity
public class Course {
@Id
@Column(name = "course_id")
private int courseId;
@Column(name = "course_name")
private String courseName;
@Column(name = "course_rating")
private int courseRating;
@ManyToMany(mappedBy = "courseList")
private List<Student> studentList;
...
}
استفاده از Entity@ برای هر کلاسی که قصد نگاشت آن را داریم الزامی است.
در روابط ManyToMany همانطور که میبینید از JoinTable@ استفاده کرده ایم. این انوتیشن زمانی کاربرد دارد که بخواهیم روابط بین موجودیت ها را در جداول جداگانه توصیف کنیم پس Hibernate جدولی به نام student_course با ستون های student_id و course_id برای ما ایجاد خواهد کرد.
در نهایت Hibernate به شکل زیر اشیا را در پایگاه داده MariaDB نگاشت میکند:
البته علاوه بر کلاس های اولیه که قبلا مشاهده کردید باید در فایل hibernate.cfg.xml فیلد hibernate.hbm2ddl.auto را برابر update قرار دهیم جزئیات بیشتر را میتونید در اینجا ببینید
توجه کنید که Hibernate قابلیت های خیلی بیشتری از این دارد و اینجا صرفا مطالب محدودی از اون گفته شد.
مطلبی دیگر از این انتشارات
ساخت مخزن گیت هاب — از صفر تا صد
مطلبی دیگر از این انتشارات
روش برخورد با مسایل در برنامه نویسی
مطلبی دیگر از این انتشارات
مقدمه ای بر کَمِل