Skip to content

Objects_Relations_ar

رامي مناف edited this page Jun 6, 2019 · 2 revisions

العلاقات بين الكائنات

أساس العلاقات

إن أساس أيّ علاقةٍ بين كائنين في صفوف هو المُعرّف ID الموجود في الحزمة org.sofof, وهذا الصف يصف موقع الكائن في قاعدة البيانات من حيث اسم الرّبط والصّف ورقم التّعريف المميّز الخاص به, وتعتمد العلاقات على كائن هذا الصف في الإشارة للكائنات الأخرى الّتي ترتبط معها, وتقوم صفوف بالكشف عن هذا الصف من خلال البحث في حقول Fields الكائن الممرّر لها, فإذا لم يكن لذلك الحقل أي قيمةٍ null ستقوم صفوف بتوليد معرفٍ خاصٍ به, أمّا إن وجدت أنّ له قيمةً فإن لم تكن تلك القيمة مستخدمةَ بالفعل ستتركها وإلا ستطلق استثناءً بأنّه لا يمكن وجود معرفين متطابقين.

public class Student{
private ID id;
private String name;
//code...
}

تكوين علاقة بين كائنين

بعد تمرير كائنٍ وتوليد المُعرّف الخاص به سيتم حفظ ذلك الكائن مع مُعرّفه في قاعدة البيانات, لذلك فعلى المستخدم قراءة الكائن مرّةً أخرى للحصول على الكائن مع مُعرّفه, وهنا يجدر الانتباه إلى أنّ مقارنة التّطابق equal بين كائنين لا يجب أن تتمّ على أساس تطابق المُعرّف إلّا في حالة وجود معرّفٍ للكائنين. يوفّر الأمر Bind إمكانية استرجاع الكائنات بسهولة من خلال تنفيذه كاستعلام بعد تنفيذه كأمر, وسيعيد في تلك الحالة نفس الكائنات الّتي تم ربطها بناءً على الدّالّة equals, وبعد إرجاع الكائن مع مُعرّفه يمكن ربطه بأي كائنٍ آخر كوضعه في أحد الحقول لكائنٍ آخر, ولا يشترط للكائن الآخر أن يكون له مُعرّفً, وحينها إن تمّ حفظ ذلك الكائن في صفوف واستُرجع مرّةً أخرى ستقوم قاعدة البيانات بالبحث في جميع حقول ذلك الكائن وحقول حقوله إلى آخر نقطةٍ بحثًا عن كائناتٍ تحمل مُعرّفًا, وعندما تجد أحدها ستقوم بقراءة آخر قيمةٍ موجودةٍ في قاعدة البيانات لذلك الكائن بناءً على مُعرّفه, وستضع القيمة الجديدة مكان القديمة, وهذا مثالٌ يوضّح ذلك:

public class Teacher implements Serializable{
    
    private static final long serialVersionUID = 124530;
    
    private ID id;
    private String name;

    public Teacher(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Teacher other = (Teacher) obj;
        if (id != null && other.id != null && !id.equals(other.id)) {
            return false;
        }
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        return true;
    }   
}
public class Course implements Serializable {

    private static final long serialVersionUID = 5465235;

    private ID id;
    private String name;
    private Teacher teacher;

    public Course(String name, Teacher teacher) {
        this.name = name;
        this.teacher = teacher;
    }
//getters and setters
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Course other = (Course) obj;
        if (id != null && other.id != null && !id.equals(other.id)) {
            return false;
        }
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        if (!Objects.equals(this.teacher, other.teacher)) {
            return false;
        }
        return true;
    }

}
//code after all preparations for database and connections
Teacher samer = new Teacher("Samer");
Bind teacherBind = new Bind(samer);
session.execute(teacherBind);
samer = (Teacher)session.query(teacherBind).get(0);
Course math = new Course("Math", samer);
session.execute(new Bind(math));
samer.setName("Majed");
session.execute(new Update(samer).set(samer));
System.out.println(session.query(new Select(Course.class).where(new ObjectCondition("getName()", Operation.Equal, "Math"))).get(0).getTeacher().getName());
//output: Majed

Clone this wiki locally