代码之家  ›  专栏  ›  技术社区  ›  chiccodoro

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

  •  0
  • chiccodoro  · 技术社区  · 15 年前

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

    如果我错了,请纠正我。

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

    背景:我有一张桌子和一个相应的类 ExcelFile 卓越档案

    卓越档案 包含属性 IsLocked LockedBy 和 DateLocked ,以便在有人处理文件时锁定该文件。他一关闭文件,锁就被释放了。

    • 爱丽丝加载DB条目以显示它。它还显示 孤岛
    • 鲍勃也这么做,这是假的。
    • 5分钟后,Alice打开文件:应用程序检查 孤岛
    • Bob打开文件:应用程序检查 孤岛 已经被缓存并且仍然 false . 所以他设置了锁并打开了应用程序。

    对于设置锁,我可以使用直接使用本机SQL查询进入数据库的方法。到目前为止,我在阅读这些属性时也做了同样的工作。

    但是我需要用 孤岛 正在使用HQL设置。另外,简单地读写对应表字段的方法本身的编码引入了映射逻辑抗拒的第二个地方,这不是很好。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Iain    15 年前

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

    但话说回来,你还是会有比赛条件的。避免比赛的一种方法是:

    1. 通过get或refresh获取实体(使用升级锁,这将避免bob和alice同时命中db时出现死锁)
    2. 检查IsLocked是否为true,如果是,则中止
    3. 设置IsLocked=true
    4. 提交事务。
    推荐文章