سؤال

ما هي بعض الأشياء التي لاحظتها في Coldfusion 9 مع CF-orm (السبات) التي يجب على المرء أن يرتبها؟

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

المحلول

  • كيان init() لا يجب أن يكون الطريقة المطلوبة للوسيطة (الحدود) ، وإلا EntityNew() وغيرها من الإجراءات CF-Imor سوف تنكسر. قد ترغب في استخدام مصنع لإنشاء الكيان ، وفرض الوسائط المطلوبة هناك.

    تم تقديم خطأ فيما يتعلق بهذا القيد في قاعدة Adobe Bugbase.

  • ORMReload() مع ormsettings.dbcreate = "drop create" قد لا تسقط جميع الجداول لك. CF9 التراكمي الإصلاح الساخن 1 يحسن هذا قليلاً ، لكنك قد ترغب في إسقاط الجداول في ديسيبل بنفسك.

  • type="date" (افتراضي للاستخدام ormtype="date") ، سوف يخزن فقط تاريخ ولكن ليس الوقت. إذا كنت تريد أن تستمر الوقت أيضًا ، فاستخدم ormtype="timestamp"

  • type="string" سوف تتخلف عن varchar(255)

  • type="numeric" سوف تتخلف عن float, ، ليس int. استخدم ormtype = "int" إذا لزم الأمر.

  • إذا fieldtype="id" ويتم ضبط المولد على بعض المولد ، سوف يتخلف ormtype int.

  • type="string" length="10" سوف نستخدم varchar(10), ، ليس char(10)

  • ormtype="char" length="10" سوف نستخدم char(1) ساكن. يستخدم sqltype="char(10)" إذا كنت بحاجة حقا.

  • type="boolean" استعمال tinyint بشكل افتراضي ، استخدم sqltype="bit" إذا كنت بحاجة إلى.

  • يجب استخدام inverse=true في علاقة ثنائية الاتجاه ، عادة في الجانب "واحد إلى كثير".

  • فعل ليس استعمال inverse="true" في علاقة أحادية الاتجاه! قد لا تستمر العلاقة على الإطلاق!

  • إذا كنت تستخدم MS-SQL ، فلا يمكن أن يكون لديك أكثر من كيان واحد مع خاصية فردية تم تعيينها على NULL ، لأن NULL تعتبر قيمة فريدة في الفهرس. فكرة جيدة لجعل العمود ليس فارغا. (أو استخدم LinkTable)

  • EntityLoad("entity", 1, true) يعمل ، ولكن EntityLoadByPK("entity", 1) هو أنظف!

  • EntityLoad(), EntityLoadByPK(), ، و ORMExecuteQuery مع unique=true, ، سيعود null إذا لم يتم العثور على الكيان. يستخدم isNull() للتحقق قبل استخدام القيمة التي تم إرجاعها.

  • ORMExecuteQuery سيعود صفيف فارغ إذا لم يتم العثور على كيان افتراضيًا.

  • لا تنس استخدام singularname خاصية في "واحد إلى كثير" / "العديد من العدد" للوظائف التي تم إنشاؤها بشكل أجمل (على سبيل المثال addDog(Dog dog) ضد addDogs(Dog dogs) .)

  • <cfdump> سيتم تحميل جميع خصائص التحميل الكسول. بدلاً من ذلك قد تحاول <cfdump var="#entityToQuery([entity])#"> أو تعيين أعلى = 1 لتفريغ بكفاءة.

  • سيتم فصل الكيان المخزّن في نطاق الجلسة بنطاق جلسة السبات ، ولن يتم تحميل خاصية الحمل الكسول. لاستعادة نطاق جلسة السبات ، استخدم entityLoadByExample() أو entitySave(entity).

  • cascade="all-delete-orphan" عادة ما يكون الأمر أكثر منطقية بالنسبة لعلاقة "واحد إلى كثير" أو "العديد من العدد". يقوم Hibernate بتعيين NULL ثم حذفه ، لذا تأكد من أن العمود غير قاطع. اختبر ومعرفة ما إذا كان هذا هو سلوك رغبتك.

  • تعيين required="true" كلما كان notnull="true", ، أكثر قابلية للقراءة للآخرين الذين يتصفحون CFC باستخدام cfcexplorer

  • EntityNew('Y') أكثر كفاءة من new com.X.Y إذا تم الاستمرار في الكيان لاحقًا وفقًا لبعض مهندس Adobe.

  • قد تنكسر العلاقة مع الكيان الموروثة في بعض الأحيان بسبب خلل السبات غير المستقل ، والاستخدام linktable كحل بديل.

  • structKeyColumn لا يمكن أن يكون PK من الكيان المستهدف.

  • لا يمكن للعديد من الاتجاهات ثنائية الاتجاه استخدام الهيكل

  • عند إضافة كيان جديد إلى التركيب ، structKeyColumn يتم تجاهله عندما يستمر CF الكيان الأصل.

  • إذا قمت بالوصول إلى صفيف أو بنية كثيرة إلى حد كبير / إلى حد كبير ، فتأكد من وجود الصفيف / الهيكل المقابل قبل الاستخدام. تم إنشاء AddX ()/hasx ()/removex () آمنة لاستخدامها في أي وقت.

  • في postInsert(), ، لم تعد جلسة السبات الكيان متوفرة ، لذلك سيتم تجاهل خاصية تعيين الممتلكات في postinsert () بصمت ، أو سيتم إلقاء استثناء من الجلسة.

  • بعد تحميل الكيان بواسطة entityLoad() أو HQL من DB ، سيتم استمرار التغييرات تلقائيًا حتى لو EntitySave() لا يسمى.

  • يتم تنفيذ المعاملة مع CF-Imm بطريقة تبدأ جلسة جديدة وتغلق عند الانتهاء.

  • داخل الحدث (أي preload () / postinsert ()) ، قد يرمي تعيين المتغيرات استثناء java حول الأنواع. استخدم Javacast () للعمل حول الخطأ.

تحديث

  • CF9.0.1+: استخدام <cfquery dbtype="hql">, ، أسهل للقيام به cfqueryparam, ، وتصحيح ناتج يوضح لك في الواقع القيم المتقلبة.

نصائح أخرى

توصيات إضافة:

  • قم بإيقاف تشغيل ormsettings.flushatrequestend = false لعدم وجود تدفق تلقائي في نهاية الطلب. بدلاً من ذلك ، استخدم المعاملات (اعتبارًا من CF9.01 ، تنطلق CFTransaction من أجل إكمال المعاملات) حول جميع معاملات الكتابة (entitysave () أو عند تحرير كيان مستمر).
  • منع حقن SQL باستخدام المعلمات المرتفعة في HQL - لم يكشف عن اسمه؟ " أو اسمه ":" تدوينات ، لضمان ربط النوع من قبل ORM ضد الحقل المعني (مثل Cfqueryparam). منع حقن SQL!
  • يسمح CF9.0.1 CFQUERY DBTYPE = "HQL" لكتابة وإخراج HQL مضمّنة. استخدم cfqueryparam لربط المعاملات المضمنة (أي ما يعادل التدوين في HQL).
  • استخدم JAFT OUTER JOIN FETCH في HQL لجلب العلاقات.
  • تجاوز الإضافة/إزالة الوظائف على CFCs مع علاقات ثنائية الاتجاه لضمان تعيين كلا الجانبين عندما يكون أي منهما.
  • Turn Ormsettings.logSql = True لعرض SQL المشتق في وحدة التحكم. اضبط إعدادات kibernate log4j لزيادة إعدادات سجل القرص من السبات.
  • انضم إلى Google Group CF-Imm-Dev. الناس المشرقون هناك.

بالاقتران مع العبث بتسجيل السبات ، يمكنك أيضًا تشغيل "الحفاظ على الاتصالات" للحصول على بيانات البيانات الخاصة بك.

مع SQL Server 2005 ، يمكنك بعد ذلك تشغيل Profiler ومشاهدة الاستعلامات القادمة من خلال.

نظرًا لأن صيانة الاتصالات خارج عن السبات ، سيتم إجبار على إنشاء بيانات جديدة معدة في كل مرة.

يمكن أن تكون قراءة البيانات المعدة صعبة ، ولكن على الأقل يمكنك رؤية الاستعلامات الخام التي يتم إنشاؤها.

إذا حافظت على اتصالات يتم إنشاء هذه العبارات المعدة مرة واحدة وترى شيئًا مثل

sp_execute 15 ، 'SomeParam'

قبل ذلك ، تم تشغيل sp_prepexec وهو المكان الذي يأتي منه 15.

يبدو أن INTITYRELOAD يتجاهل التحميل كسول مثل CFDUMP.

أستخدمه بعد entitysave للاستيلاء على أي أعمدة افتراضية في DB. أرى في SQL Profiler (أداة تتبع لخادم SQL) الكثير من الاستعلامات القادمة من خلال.

إذا قامت بتغييره إلى entityloadbypk ، إلخ ، فسوف يقوم بتحميل الكائن ولن يرى جميع استعلامات العلاقة الزائدة التي يمكن أن تسبب مشكلات كبيرة بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top