سؤال

ما هو الفرق بين جلسة nhibernate.get و session.createcriteria؟

قصتي هي:

في منتجنا ، قمنا بتنفيذ SoftDeletion عن طريق إضافة واجهة IsoftDeletable ، كل فئة تنفذ هذه الواجهة لديها حقل حذف وحذف. لدينا أيضًا فئة مراجعة مما يعني أن كل فئة تنفذها: CreateDate ، CreatedBy ، ModifiedDate ، ModifiedBy.

ها هي المصادر:

public class SaveUpdateEventListener : DefaultSaveEventListener
{

    private readonly ISecurityContextService securityContextService;

    public SaveUpdateEventListener(ISecurityContextService securityContextService)
    {
        this.securityContextService = securityContextService;
    }

    protected override object PerformSaveOrUpdate(SaveOrUpdateEvent @event)
    {
        this.PrepareAuditableEntity(@event);
        return base.PerformSaveOrUpdate(@event);
    }


    private void PrepareAuditableEntity(SaveOrUpdateEvent @event)
    {
        var entity = @event.Entity as AuditableEntity;

        if (entity == null)
        {
            return;
        }

        if (this.securityContextService.EdiPrincipal == null)
        {
            throw new Exception("No logged user.");
        } 

        if (entity.Id == 0)
        {
            this.ProcessEntityForInsert(entity);
        }
        else
        {
            this.ProcessEntityForUpdate(entity);
        }
    }


    private void ProcessEntityForUpdate(AuditableEntity entity)
    {
        entity.ModifiedBy = securityContextService.GetLoggedUser();
        entity.ModifiedDate = DateTime.Now;
    }


    private void ProcessEntityForInsert(AuditableEntity entity)
    {
        entity.CreatedBy = securityContextService.GetLoggedUser();
        entity.CreatedDate = DateTime.Now;
    }

أيضا لقد تجاوزنا طريقة الجلسة.

public virtual T Get(long id)
    {
        if (typeof(ISoftDeletable).IsAssignableFrom(typeof(T)))
        {
            return
                this.Session.CreateCriteria(typeof(T))
                .Add(Restrictions.Eq("Id", id))
                //.Add(Restrictions.IsNull("DeletedDate"))
                .UniqueResult<T>();
        }

        return Session.Get<T>(id);
    }

الآن في بعض السياق ، ألقى التطبيق استثناء Stackoverflow في أساليب GET على كيان قابلة للمراجعة. بعد بعض التحقيقات ، لاحظت أنه يخلق حلقة بين استعدادات ForupDate/SecurityContexTservice.getLoggedUser والحصول على طريقة من مستودعنا المخصص. كما ترون أنني علقت على القيود المفروضة على DeletedDate ، وهذا يعني أن Sessage.get (id) يجب أن تُرجع نفس النتيجة مثل المعايير التي تم إنشاؤها. ولكن إذا ذهبت على الرغم من this.session.createcriteria (typeof (t)) أحصل على استثناء StackOverflow ، إذا قمت بتعليق هذا واحد وترك جلسة العودة فقط.

هذا يجعلني أفكر في أن Session.get و Session.Createcriteria يعمل بشكل مختلف. أيه أفكار؟

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

المحلول

سوف تحصل على ذاكرة التخزين المؤقت للجلسة. المعايير لن.

بمعنى آخر: ستؤدي المعايير دائمًا إلى استفسار / استدعاء SQL إلى DB. لن تؤدي GOT دائمًا إلى استعلام SQL. إذا تم بالفعل تحميل كيان بواسطة Nhibernate في جلسة ، وكنت ترغب في استرداد الكيان مرة أخرى باستخدام GET ، فإن Nhibernate ستعيد الكيان الذي تم تحميله بالفعل من ذاكرة التخزين المؤقت.

نصائح أخرى

بالإضافة إلى ذلك ، يمكنك تعيين حيث المعلمة في الفصل الدراسي. هناك يمكنك إضافة: "deleteddate هو فارغ". عندما يتم تنفيذ NHIBERNATE أضف هذا حيث عبارة إلى استعلام تم إنشاؤه.

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