2

我正在开发一个使用 NHibernate 作为 ORM 的项目。

相当多的实体可以作为“只读”加载到会话中,因为它们不应在检索后更新。

我尝试以两种不同的方式做到这一点:

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

或者:

criteria.SetReadOnly(true);

然而,在这两种方式中,我都可以看到该实体存在于PersistenceContextISession 中。

这是正常的吗?我希望,由于实体是只读/不可变的,它不应该出现在 PersistenceContext 中。实体类型是复杂类型;它与其他类型有多种关联。

4

1 回答 1

1

nhibernate 中的只读功能有一些限制。该函数的名称让人期待更严格的防止对象更改的保证。如果您查看文档(http://nhibernate.info/doc/nh/en/index.html#readonly),有许多例外情况可能会导致数据库发生意外更改。

从文档:

当实体为只读时:

  • NHibernate 不会对实体的简单属性或单端关联进行脏检查
  • NHibernate 不会更新简单的属性或可更新
    的单端关联

  • 如果仅
    更改简单属性或单端可更新关联, NHibernate 将不会更新只读实体的版本

在某些方面,NHibernate 将只读实体视为非只读实体:

  • NHibernate 将操作级联到实体映射中定义的关联。
  • NHibernate 更新版本,如果实体有一个包含更改的集合,该更改会弄脏实体;
  • 可以删除只读实体。

考虑到您的期望,它认为对象总是被添加到持久性上下文中,即使它们是只读加载的。否则 Identity-Map -Pattern 将不成立。在持久性上下文中,有一个标志表示实体是只读的。

身份映射

在上下文中,可以通过打开单个实体条目来检查状态。

于 2015-05-11T09:21:16.553 回答