Сущности, выбранные как ReadOnly в NHibernate, присутствуют в PersistenceContext

Я работаю над проектом, который использует NHibernate в качестве ORM.

Довольно большое количество объектов может быть загружено в сеанс как «только для чтения», поскольку они не должны обновляться после получения.

Я пробовал сделать это двумя разными способами:

var entity = criteria.UniqueResult<MyType>();
_session.SetReadOnly(entity, true);

or:

criteria.SetReadOnly(true);

Однако в обоих случаях я вижу, что объект присутствует в PersistenceContext ISession.

Это нормально ? Я ожидал, что, поскольку сущность доступна только для чтения / неизменна, она не должна присутствовать в PersistenceContext. Тип объекта - сложный тип; он имеет множество ассоциаций с другими типами.


person Frederik Gheysels    schedule 05.05.2015    source источник
comment
Привет, Фредерик, соответствует ли мой ответ вашей информации?   -  person hessenmob82    schedule 19.05.2015


Ответы (1)


В nhibernate есть некоторые ограничения для функции только для чтения. Название функции позволяет рассчитывать на более жесткую гарантию предотвращения изменения объекта. Если вы посмотрите документацию (http://nhibernate.info/doc/nh/en/index.html#readonly) существует множество исключений, которые могут привести к непреднамеренным изменениям в базе данных.

Из документов:

Когда объект доступен только для чтения:

  • NHibernate не выполняет грязную проверку простых свойств объекта или односторонних ассоциаций.
  • NHibernate не будет обновлять простые свойства или обновляемые
    односторонние ассоциации
  • NHibernate не будет обновлять версию объекта, доступного только для чтения, если
    изменены только простые свойства или односторонние обновляемые ассоциации

В некотором смысле NHibernate обрабатывает объекты, доступные только для чтения, так же, как объекты, которые не доступны только для чтения:

  • NHibernate каскадирует операции в ассоциации, как определено в сопоставлении сущностей.
  • NHibernate обновляет версию, если у объекта есть коллекция с изменениями, загрязняющими объект;
  • Сущность, доступная только для чтения, может быть удалена.

Принимая во внимание ваши ожидания, он считает, что объекты всегда добавляются в контекст сохранения, даже если они загружены только для чтения. В противном случае Identity-Map -Pattern не сохранится. В контексте постоянства есть флаг, который сигнализирует, что объект доступен только для чтения.

IdentityMap

В контексте состояние можно проверить, открыв запись отдельного объекта.

person hessenmob82    schedule 11.05.2015