كيف يمكن للمرء حذف كيان في أحمق له هويته ونوعه فقط؟

StackOverflow https://stackoverflow.com/questions/1323427

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أتساءل كيف يمكن للمرء حذف كيان لديه هويته ونوعه (كما هو الحال في الخرائط) باستخدام Nibernate 2.1؟

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

المحلول

إذا كنت تستخدم التحميل كسول، فإن التحميل يؤدي فقط إلى إنشاء وكيل.

session.Delete(session.Load(type, id));

مع NH 2.1 يمكنك استخدام HQL. لست متأكدا من كيف يبدو بالفعل، ولكن شيء من هذا القبيل: لاحظ أن هذا يخضع لحقن SQL - إذا كان ذلك ممكنا استخدام الاستفسارات المعلمة بدلا من setparameter ()

session.Delete(string.Format("from {0} where id = {1}", type, id));

يحرر:

للحصول على تحميل، لا تحتاج إلى معرفة اسم عمود المعرف.

إذا كنت بحاجة إلى معرفة ذلك، فيمكنك الحصول عليها بواسطة البيانات الوصفية NH:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

تحرير آخر.

session.Delete() هو مثيل الكيان

عند استخدام Session.delete ()، NH تحميل الكيان على أي حال. في البداية لم يعجبني. ثم أدركت المزايا. إذا كان الكيان جزءا من بنية معقدة باستخدام الميراث أو المجموعات أو "أي" Reportences، فهي في الواقع أكثر كفاءة.

على سبيل المثال، إذا الفصل A و B كلاهما يرث من Base, ، لا يحاول حذف البيانات في الجدول B عندما يكون الكيان الفعلي من النوع A. وبعد لن يكون ذلك ممكنا دون تحميل الكائن الفعلي. هذا مهم بشكل خاص عندما يكون هناك العديد من الأنواع الموروثة التي تتكون أيضا من العديد من الجداول الإضافية لكل منها.

يتم إعطاء نفس الوضع عندما يكون لديك مجموعة من BaseS، الذي يحدث ليكون كل مثيلات A. وبعد عند تحميل المجموعة في الذاكرة، يعرف NH أنه لا يحتاج إلى إزالة أي B-أمور.

إذا كان الكيان A لديه مجموعة من BS، التي تحتوي CS (وهلم جرا)، لا يحاول حذف أي CS عندما تحصيل BS فارغة. هذا ممكن فقط عند قراءة المجموعة. هذا مهم بشكل خاص عندما يكون C معقدا خاصا به، تجميع المزيد من الجداول وما إلى ذلك.

كلما زادت تعقيدا وديناميكيا هو الهيكل، والأكثر كفاءة هو تحميل البيانات الفعلية بدلا من حذفها "عمياء".

HQL حذف لها مطبات

حذف HQL لعدم تحميل البيانات إلى الذاكرة. لكن HQL-deletes ليست ذكية. يترجمون أساسا اسم الكيان إلى اسم الجدول المقابل وإزالة ذلك من قاعدة البيانات. بالإضافة إلى ذلك، حذف بعض بيانات المجموعة المجمعة.

في هياكل بسيطة، قد يعمل هذا جيدا وكفاءة. في الهياكل المعقدة، لا يتم حذف كل شيء، مما يؤدي إلى انتهاكات القيود أو "تسرب ذاكرة قاعدة البيانات".

خاتمة

حاولت أيضا تحسين الحذف مع NH. استسلمت في معظم الحالات، لأن NH لا يزال أكثر ذكاء، فإنه "يعمل فقط" وهو عادة بسرعة كافية. واحدة من خوارزميات الحذف الأكثر تعقيدا كتبت هي تحليل تعريفات تعيين NH وإنشاء بيانات حذف من ذلك. وليس مفاجأة - لا يمكن ذلك دون قراءة البيانات من قاعدة البيانات قبل الحذف. (لقد خفضت ذلك فقط لتحميل المفاتيح الأساسية فقط.)

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