یکی از قابلیت های اصلی هر فریمورک ORM یا یه عبارتی Object-Relational-Mappingها قابلیت تعریف و ایجاد روابط میان فیلدهای جدول های اطلاعاتی می باشد. در حالت کلی دو نوع رابطه اصلی میان فیلدهای جدول های اطلاعاتی شناخته شده هستند. رابطه یک به چند و رابطه چند به چند.
در این مقاله سعی داریم جزئیات روابط یک به چند را مورد بررسی قرار دهیم.
سوال اصلی در اینجا این است که یک رابطه یک به چند چه جزئیاتی می تواند داشته باشد؟
پاسخ اینست که در رابطه های یک به چند جهت رابطه به عنوان یکی از ویژگی های رابطه میتواند اهمیت داشته باشد و به همین دلیل در فریم ورکهایی مانند Hibernate دو کلیدواژه برای ایجاد رابطه های یک به چند وجود دارد:
- ManyToOne
- OneToMany
از طرفی دیگر اگر در یک کاربرد خاص لازم باشد جهت رابطه به صورت یکطرفه یعنی unidirectional نبوده بلکه به صورت دوطرفه یا به عبارتی bidirectional باشد آنگاه باید نسبت به مفهوم ManyToOne و OneToMany آشنایی داشته باشیم تا بتوانیم از هر دوی آنها به منظور ایجاد یک رابطه دوطرفه بهره ببریم.
برای درک معنای جهت در رابطه یک به چند سه مثال مطرح میکنیم:
در این مثال ها خواهید دید که جهت رابطه و یک طرفه یا دوطرفه بودن رابطه کاملابه مورد کاربرد و فضای مفهومی مساله وابسته می باشد.
۱. رابطه میان یک ماشین و چرخ هایش
در این رابطه لازم است ماشین بداند کدام چرخ ها متعلق به اوست ولی چرخ ها نیازی ندارند که بدانند متعلق به کدام ماشین هستند.
در Hibernate کد زیر بیانگر رابطه بالا خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.neginnet.training.orm; import javax.persistence.Column; import javax.persistence.ManyToOne; public class Car { private Wheel wheel; @OneToMany @Column(name = "weelId") public Wheel getWheel() { return wheel; } public void setWheel(Wheel wheel) { this.wheel = wheel; } } |
۲. رابطه میان یک شخص و پیام هایی که ارسال کرده است
در این رابطه ضرورتی ندارد شخص بداند که کدام پیام ها را ارسال نموده ولی پیام ها باید حتما بدانند که از سوی چه شخصی ارسال شده اند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.neginnet.training.orm; import javax.persistence.Column; import javax.persistence.ManyToOne; public class Message { private Person sender; @ManyToOne @Column(name = "senderId") public Person getSender() { return sender; } public void setSender(Person sender) { this.sender = sender; } } |
۳. رابطه میان یک کلاس و دانش آموزانش
این مثال بیانگر یک رابطه دوطرفه است به این شکل که هر دانش آموز باید بداند متلق به کدام کلاس می باشد و در عین حال هر کلاس باید بداند که دانش آموزانش چه کسانی هستند.