أشياء يجب الانتباه إليها في Coldfusion 9 مع CF-orm
-
21-09-2019 - |
سؤال
ما هي بعض الأشياء التي لاحظتها في Coldfusion 9 مع CF-orm (السبات) التي يجب على المرء أن يرتبها؟
المحلول
كيان
init()
لا يجب أن يكون الطريقة المطلوبة للوسيطة (الحدود) ، وإلاEntityNew()
وغيرها من الإجراءات CF-Imor سوف تنكسر. قد ترغب في استخدام مصنع لإنشاء الكيان ، وفرض الوسائط المطلوبة هناك.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"
ويتم ضبط المولد على بعض المولد ، سوف يتخلف ormtypeint
.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 باستخدام cfcexplorerEntityNew('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 ، إلخ ، فسوف يقوم بتحميل الكائن ولن يرى جميع استعلامات العلاقة الزائدة التي يمكن أن تسبب مشكلات كبيرة بالنسبة لي.