Grails: رسم خرائط فئة المجال (مجموعة من أنواع المستخدمين السباتية)
-
26-09-2019 - |
سؤال
أتساءل عما إذا كان من الممكن تنفيذ نموذج المجال التالي.
دعنا نمتلك فئة مجال تحتوي على مجموعة من الفواصل الزمنية (وقت Joda). يمكنني استخدام org.joda.time.contrib.hibernate.persistraftInterNinterval نوع مستخدم Hibernate لتخطيط الفاصل الزمني إلى جدول قاعدة البيانات (بطريقة مماثلة كما في http://www.grails.org/jodatime+plugin). ومع ذلك ، لا يمكنني معرفة كيفية تنفيذ التعيين إذا كانت لدي فترات زمنية ، وليس فاصل واحد فقط.
مثال:
class Activity { ... Set intervals = [] ... static hasMany = [ intervals: org.joda.time.Interval ] // This is incorrect implementation, I have set of intervals // and this would be correct if I had only one interval // How to implement mapping in this case? static mapping = { intervals type: PersistentInterval, { column name: "start" column name: "end" } }
}
يفشل التنفيذ أعلاه مع الخطأ التالي:
2010-10-23 18: 30: 25،483 [Main] Context.GrailsContextLoader-خطأ في تنفيذ bootstraps: خطأ في إنشاء الفول مع اسم "Messagesource": فشل تهيئة Bean ؛ الاستثناء المتداخل هو org.springframework.beans.factory.beancreationException: خطأ في إنشاء الفول مع اسم "المعاملات": لا يمكن حل الإشارة إلى Bean 'SessionFactory "أثناء تعيين خاصية Bean' SessionFactory ؛ الاستثناء المتداخل هو org.springframework.beans.factory.beancreationException: خطأ في إنشاء الفول مع اسم "SessionFactory": فشل الاحتجاج من طريقة init ؛ الاستثناء المتداخل هو org.hibernate.mappingException: المفتاح الأجنبي (FK4FDC5B1E5107CA0: يجب أن يكون للنشاط_ إنشاء الفول مع اسم "Messagesource": فشل تهيئة الفول ؛ الاستثناء المتداخل هو org.springframework.beans.factory.beancreationException: خطأ في إنشاء الفول مع اسم "المعاملات": لا يمكن حل الإشارة إلى Bean 'SessionFactory "أثناء تعيين خاصية Bean' SessionFactory ؛ الاستثناء المتداخل هو org.springframework.beans.factory.beancreationException: خطأ في إنشاء الفول مع اسم "SessionFactory": فشل الاحتجاج من طريقة init ؛ الاستثناء المتداخل هو org.hibernate.mappingException: المفتاح الخارجي (FK4FDC5B1E5107CA0: Activity_intervals [start ، end])) tomcatserver.groovy: 212)
اعتقدت أن العمل في هذه المشكلة هو استخراج الفاصل الزمني لفصل فئة المجال الفاصل الزمني وتحديد التعيين داخلها. ومع ذلك ، فإن الفاصل الزمني هو الطبقة النهائية ، لذا فإن التمديد غير ممكن.
شكرا لنصائحك.
المحلول
أنا أرد سؤالي الخاص ، ربما ستكون هذه الإجابة مفيدة لشخص ما.
حتى الآن لم أجد طريقة واحدة فقط كيفية تنفيذ نموذج معين - بواسطة ملفات رسم خرائط XML Hibernate:
<hibernate-mapping package="mappingtest">
<class name="Activity">
<id name="id">
<generator class="native"/>
</id>
<set name="intervals">
<key column="activity_id" not-null="true"/>
<element type="org.joda.time.contrib.hibernate.PersistentInterval">
<column name="startDate"/>
<column name="endDate"/>
</element>
</set>
</class>
</hibernate-mapping>
وتنفيذ فئة المجال:
class Activity {
Long id
Set intervals = []
static constraints = {
}
}
اضطررت أيضًا إلى نقل فئة المجال من Grails-App/Domain إلى دليل SRC/Groovy ، وإلا فشل تشغيل التطبيق مع (Grails-1.3.5):
...
org.hibernate.duplicateMappingException: MappingTest.
...
المشكلة الثانية في التنفيذ أعلاه التي اكتشفتها هي أنه عندما قمت بتشغيل السقالات (لغرض الاختبار) بواسطة:
class ActivityController {
static scaffold = true
...
}
فشل عرض النشاط الذي تم إنشاؤه مع الخطأ:
رسالة استثناء: لا يوجد مثل هذا الخاصية: معرف للفئة: org.joda.time.interval الحلول الممكنة: النهاية الناتجة عن: خطأ في تقييم التعبير [I.ID] على السطر [38]: لا يوجد مثل هذا الخاصية: معرف للفئة: org.joda .Time.Interval الحلول الممكنة: نهاية
لكن التنفيذ اليدوي للحصول على أنشطة من DB وعرضها يعمل.
تحرير: بالإضافة إلى ذلك ، وجدت حلًا لقضايا السقالات و duplicatemappexception. كانت ناتجة عن موقع غير صالح للنشاط. hbm.xml - كانت بنية دليل الحزمة مفقودة. الموقع الصحيح هو Grails-App/Conf/Hibernate/MappingTest/Activity.hbm.xml.