سؤال

أنا أبواب مبتدئ (ومكتب مبتدئ رائع)، وأعمل من خلال بعض دروس الشعبات. كمستخدم جديد، فإن قذيفة الشجر هي أداة صغيرة مفيدة حقا بالنسبة لي، لكنني لا أستطيع معرفة كيفية رؤية فصالتي وأوعيتي. إليك ما أحاول:

% grails create-app test
% cd test
% grails create-domain-class com.test.TestObj
% grails shell
groovy:000> new TestObj()
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj

كنت تحت الانطباع بأن قذيفة الشجر يمكن أن ترى جميع وحدات التحكم والخدمات وكائنات المجال. ما الأمر مع هذا؟ هل أحتاج إلى القيام بشيء آخر هنا؟

حاولت شيئا آخر:

groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save 
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj

ما الخطأ الذي افعله؟

تحرير: حسنا، رأيت الإجابات حول استخدام الاسم الكامل وكذلك باستخدام .save() بدلا من .save. وبعد ولكن ماذا عن هذا واحد؟

groovy:000> new com.test.TestObj().save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

ماذا أفعل الخطأ هذه المرة؟

هل كانت مفيدة؟

المحلول

أنا نصيحة بيرت الثانية لاستخدام وحدة التحكم بدلا من القذيفة. فيما يتعلق الاستثناء:

groovy:000> new com.test.TestObj().save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

يمكنك محاولة تشغيل هذا الرمز بشكل صريح مع المعاملة:

import com.test.TestObj

TestObj.withTransaction{ status ->
    TestObj().save()
}

نصائح أخرى

تحتاج إلى الحزمة نظرا لأنها ممكنة (ولكن ليست فكرة جيدة) للحصول على فئة مجالتين بنفس الاسم في حزم مختلفة.

بالنسبة للجلسة الثانية، يجب أن تكون foo.save ()، وليس foo.save.

أنا أفضل وحدة التحكم، إنها أسهل بكثير للعمل معها. تشغيل "تحكم الشجر" وسيبدأ تطبيق Swing. إنه مختلفا قليلا عن وحدة التحكم الجماعية العادية في أنه حصل على متغير ضمنيا "CTX" متاح هو سياق تطبيق الربيع. يمكنك استخدام ذلك للوصول إلى الخدمات والفاصوليا الربيعية الأخرى عبر "ctx.getbean ('fooservice')"

سيتوجب عليك import com.test.TestObj أو مرجعها new com.test.TestObj() كما أظهرت.

لاحظ أن 'save"ليس مفتاحا ولكن الطريقة الديناميكية التي تزين فئة المجال مع وقت التشغيل.

groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save()
===> com.test.TestObj : 2
groovy:000> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top