【问题标题】:Unique Constraint Nhibernate唯一约束休眠
【发布时间】:2010-03-17 15:57:56
【问题描述】:

我有一个具有代理 ID 和自然 ID 的 Nhibernate 映射的对象。由于自然 ID 是唯一受限制的,如果对象已经在具有相同自然 ID 的数据库中,则插入查询将失败。我对此的解决方案是在尝试插入之前手动检查数据库中是否存在自然 ID。

有没有办法指定 Nhibernate 在插入自然 ID/唯一约束之前进行选择?

【问题讨论】:

    标签: nhibernate hibernate fluent-nhibernate


    【解决方案1】:

    无论如何,你必须去数据库。

    但是,您可以使用 NH Validator 以更透明的方式进行操作。

    阅读 Fabio Maulo 的以下帖子:http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html

    【讨论】:

    • Diego 发布的链接是使用 NH Validator 查询数据库以确保不违反 BlogPost 的自然 ID(标题和日期)的示例。这将完全按照您的要求进行 - 在尝试保存实体之前,NHibernate 将检查验证,这将导致执行选择查询。
    【解决方案2】:

    我最终为 Nhibernate 构建了一个 SaveOrUpdate 侦听器,以便在将对象保存到数据库中时,我可以确定是否应该检查它们的唯一性。我不只是选择查看数据库中是否存在对象唯一属性,而是选择更新(悲观锁定),因此该行将被锁定,以便我可以安全地合并和更新对象。确实会创建 O(2N) 查询,但如果它成为问题,我可以将其简化为单个合并语句。

    http://en.wikipedia.org/wiki/Merge_(SQL)

    【讨论】:

    • 如果你能分享你是如何做到这一点的,那就太好了。我处于同样的情况,正在努力实现这样的监听器
    【解决方案3】:

    我通常通过尝试插入(提交更改)并捕获产生的异常来解决这种情况。

    无论如何,您都必须访问数据库,因此失败的 INSERT 与 SELECT 的成本基本相同(如果不便宜的话)......而且更安全。

    【讨论】:

    • 问题出在这些对象是级联结构的一部分时。我真的不关心的单个对象是否更新或插入会破坏整个构造的事务。
    • 这就是为什么你应该两者都做!
    【解决方案4】:

    我在保存或更新之前检查唯一性。然后我可以显示一个很好的验证消息。我发现很难阅读异常并将约束违规与正确的字段匹配。也许 NH 已经为支持的数据库抽象了错误代码……我还没有研究过。在极少数情况下,检查和保存之间违反了约束,用户会收到一般错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多