2015-05-05 3 views
2

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

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

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

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

или:

criteria.SetReadOnly(true); 

В обоих случаях однако, я могу видеть, что объект присутствует в PersistenceContext из ISession.

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

+0

Привет, Фредерик, мой ответ соответствует вашей информации? – hessenmob82

ответ

1

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

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

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

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

В некотором смысле, NHibernate лечит только для чтения сущности так же, как лица, которые не только для чтения:

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

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

IdentityMap

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