让NHibernate在每次调用时获取某些属性

时间:2010-10-29 15:47:25

标签: nhibernate nhibernate-mapping

通常,当您为类的某个属性定义映射时,NHibernate会在获取属性后立即将值保存在属性中。要么在获取对象时立即获取它,要么在第一次调用属性的getter时被懒惰地加载,但是一旦从数据库加载它就会被提取。

如果我错了,请纠正我。

是否可以配置映射,以便对同一个getter的每次单独调用都会导致NHibernate转到数据库并再次读取该值?

背景:我有一个表和一个相应的类ExcelFile来管理某些Excel文件的路径和元数据。每个ExcelFile对象代表一个文件。

ExcelFile包含属性IsLockedLockedByDateLocked,目的是在有人处理文件时锁定该文件。一旦他关闭文件,就会释放锁定。

缓存这些属性可能会引入竞争条件:

  • Alice加载数据库条目以显示它。它还会显示IsLocked。这是假的。 NHibernate缓存了这个值。
  • Bob做同样的事,这是假的。
  • 5分钟后,Alice打开文件:应用程序再次检查IsLocked,然后设置锁定。
  • Bob打开文件:应用程序检查已缓存但仍为IsLocked的{​​{1}}。所以他设置锁并打开应用程序。

为了设置锁,我可以使用本机SQL查询直接写入数据库的方法。到目前为止,我一直在阅读这些属性。

但是我需要查询使用HQL设置false的条目。简单地读取和写入相应表字段的方法的编码也引入了映射逻辑抵抗的第二个位置,这不是很好。

1 个答案:

答案 0 :(得分:1)

你可能会这样做,我听说nHibernate现在支持延迟加载属性,这是朝这个方向迈出的一步。

但话虽如此,你仍然会有竞争条件。避免竞争条件的一种方法如下:

  1. 开始交易
  2. 通过get或refresh获取实体(使用升级锁定,这样可以避免死锁,因为bob和alice会在同一时间点击db)。
  3. 检查IsLocked是否为真,如果是,则中止
  4. 设置IsLocked = true
  5. 提交交易。