رسم خرائط العلاقات مع السبات
سؤال
ما زلت أتعلم كيفية إعداد هذه التعيينات باستخدام تعليقات JPA بحيث يكون هذا خطأ مبتدئًا.
لدي فئة مستخدم وفئة الدورة التدريبية. في قاعدة البيانات ، تحتوي كل دورة على مفتاح خارجي للمستخدم في كل صف (فكر في المستخدم كمعلم يقوم بتدريس الدورة). لذلك يمكن أن يكون لكل مستخدم دورات متعددة ، ولكن كل دورة لديها مستخدم واحد فقط.
في تعيين هذه الفئات ، كتبت الرمز التالي أدناه:
@Entity
public class User extends BaseModel {
@OneToMany(mappedBy="course")
private Collection<Course> courses;
public void setCourses(Collection<Course> courses) { this.courses = courses; }
public Collection<Course> getCourses() { return courses; }
}
@Entity
public class Course extends BaseModel {
@ManyToOne
@JoinColumn(name="user_id")
private User user;
public void setUser(User user) { this.user = user; }
public User getUser() { return user; }
}
لقد حذفت الحقول غير ذات الصلة وعرض القاعدة فقط يمثل المفتاح الأساسي في كل جدول. هل هناك أي شيء خاطئ بشكل صارخ هنا؟ إذا لم يكن الأمر كذلك ، فما الذي سيكون طريقة جيدة للتواصل مع تصحيح مشكلة مثل هذه.
أتلقى nullpointerxception عندما أحاول الاتصال بـ SELECT على جدول المستخدم. ومع ذلك ، عندما أخرج الإشارات إلى فئة الدورة التدريبية في فئة المستخدم ، كل شيء يعمل بشكل جيد تمامًا.
الخط المعني في صف DAO الخاص بي. ربما يفشل مدير الكيان في التهيئة. ها هو الرمز.
Query query = Stripersist.getEntityManager().createQuery(getQuery(fieldName, null)).setParameter(fieldName, value);
CreateEquery () فقط يعود:
String query = "FROM " + entityClass.getName() + " t WHERE t." + fieldName + " = :" + fieldName;
أنا أستخدم إطار عمل Stripes و Hibernate و Stripersist إذا كان ذلك يوفر أي أدلة أخرى حول الخطأ.
المحلول
من النظرة الأولى ، يبدو أنك يجب أن تكتب:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
بمعنى آخر. في onetomany medpedby يجب أن تشير إلى الحقل الذي يشير إلى الكائن الحالي.
نصائح أخرى
يشير MedpedBy إلى أن الكيان في هذا الجانب هو عكس العلاقة ، ويقيم المالك في الكيان "الآخر". في حالتك ، كما يجب أن يكون Axtavt هو:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
ينص على أنه يمكن للمستخدم اختيار العديد من الدورات التدريبية والدورة التي تحمل ملكية هذه العلاقة.