проверка, являются ли объекты (свойства и коллекции) грязными - PullRequest
3 голосов
/ 30 июня 2011

У меня есть сущность со многими отношениями один-к-одному (cascade = "all-delete-orphan") и коллекциями.

Я хочу проверить, является ли эта сущность грязной (включая ее коллекции и свойства)/ сущностей из этих отношений один-к-одному), есть ли способ сделать это?

Я следую этой статье, но она не охватывает всего, что мне нужно, любая помощь будет оценена,

Ответы [ 2 ]

1 голос
/ 18 марта 2015

Метод onFlushDirty(...) (расширяет EmptyInterceptor в Hibernate) работает для меня, чтобы проверить грязную коллекцию. Родительская сущность с вложенной коллекцией передается в onFlushDirty, но я не знал, что переданная сущность может быть элементом коллекции. Как только я обнаружил, что это работает как для вложенной коллекции, так и для ее родительского объекта.

public class PropertyChangeInterceptor extends EmptyInterceptor{

public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types)

Другой метод, onCollectionUpdate(...), также можно использовать для обнаружения грязной коллекции, он вызывается после onFlushDirty(...).

0 голосов
/ 30 июня 2011

Вы можете использовать прослушиватель NHibernate, например, так:

public class AuditUpdateListener : IPostUpdateEventListener
{
    private const string _noValueString = "*No Value*";

    private static string getStringValueFromStateArray(object[] stateArray, int position)
    {
        var value = stateArray[position];

        return value == null || value.ToString() == string.Empty
                ? _noValueString
                : value.ToString();
    }

    public void OnPostUpdate(PostUpdateEvent @event)
    {
        if (@event.Entity is AuditLogEntry)
        {
            return;
        }

        var entityFullName = @event.Entity.GetType().FullName;

        if (@event.OldState == null)
        {
            throw new ArgumentNullException("No old state available for entity type '" + entityFullName +
                                            "'. Make sure you're loading it into Session before modifying and saving it.");
        }

        int[] dirtyFieldIndexes = @event.Persister.FindDirty(@event.State, @event.OldState, @event.Entity, @event.Session);

        ISession session = @event.Session.GetSession(EntityMode.Poco);

        string entityName = @event.Entity.GetType().Name;
        string entityId = @event.Id.ToString();

        foreach (int dirtyFieldIndex in dirtyFieldIndexes)
        {
            //For component types, check:
            //  @event.Persister.PropertyTypes[dirtyFieldIndex] is ComponentType

            var oldValue = getStringValueFromStateArray(@event.OldState, dirtyFieldIndex);
            var newValue = getStringValueFromStateArray(@event.State, dirtyFieldIndex);

            if (oldValue == newValue)
            {
                continue;
            }

            // Log
            session.Save(new AuditLogEntry
                                {
                                    EntityShortName = entityName,
                                    FieldName = @event.Persister.PropertyNames[dirtyFieldIndex],
                                    EntityFullName = entityFullName,
                                    OldValue = oldValue,
                                    NewValue = newValue,
                                    Username = Environment.UserName,
                                    EntityId = entityId,
                                    AuditEntryType = AuditEntryType.PostUpdate
                                });
        }

        session.Flush();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...