【问题标题】:How to override equals for specific NHibernate class如何覆盖特定 NHibernate 类的等于
【发布时间】:2009-07-15 12:44:51
【问题描述】:

我正在努力弄清楚我应该如何覆盖 equals 并为我正在使用 NHibernate 编写的类获取哈希码。

基本业务场景是用户不能在 90 天内重复使用相同的密码。

所以我有一个“用户”,它有很多“历史密码”......用户类很简单,因为我只是在等号中使用登录名。下面是我的 HistoricalPassword 类。

public class HistoricalPassword
{
    public virtual int HistoricalPasswordId { get; set; }
    public virtual User User { get; set; }
    public virtual DateTime ChangeDate { get; set; }
    public virtual string FormerPassword { get; set; }
}

我会从商业角度说,用户和 ChangeDate 的组合会给我平等。但是......在 equals 方法中引用用户似乎不正确(因为一件事会导致延迟加载发生)......而且从我使用 HistoricalPasswordId 的 PK 阅读的内容来看,这是一个禁忌也是。

任何人都可以提供一些关于他们将如何覆盖 equals 的建议吗?

编辑 ::: 我想我问这个问题的方式可能有点误导。对于如何执行确保密码不被重用的业务规则,我并不感到困惑……也不知道我如何知道两个密码是否相等或是否安全。我真正想知道的是与 NHibernate 相关的实体级别,我将如何覆盖该对象的 Equals,以便 NHibenate 不会在会话和/或缓存中出现欺骗。根据 NHibernate 文档 (https://www.hibernate.org/hib_docs/nhibernate/html/persistent-classes.html),我应该使用业务键相等来覆盖 equals。在这种情况下,我只是不确定在比较中使用 User 的引用对象是否是个好主意。

【问题讨论】:

    标签: c# nhibernate equals gethashcode


    【解决方案1】:

    我不会为此覆盖 Equals - 您并没有断言这些记录是相等的,只是它们引用了相同的密码,不是吗?

    您肯定只需要一个 HQL 或条件查询来为您提供过去 90 天内设置的历史密码吗?

    编辑:您可能还想检查您是如何存储密码的。数据库中的明文密码不是一个好主意。可能是您的 NHibernate 用户类型正在将加密密码解密为我们可以看到的字符串属性,当然...

    【讨论】:

    • 感谢您的快速回复...并担心我的安全性 :) 为了简化起见,我们假设我的密码是安全的。但是回到这个问题......我觉得有人说你必须覆盖equals和gethashcode,否则你注定要使用NHibernate,因为你最终会在你的会话中出现重复。 .然后有同样多的人说不要打扰覆盖或只是在平等检查中使用PK......!!!哎呀!!!
    • 实体的相等性与主键的相等性肯定是一样的,所以相应地覆盖Equals。但你所说的不是真正的平等,而是某种其他的等价。
    【解决方案2】:

    我认为 HistoricalPassword 是一个值对象,而不是一个实体。

    因此,这意味着它的“ID”将由其所有属性的值决定。

    【讨论】:

      【解决方案3】:

      您可以通过多种方式来解决此问题。

      如果你想用相等来做,那么就会涉及到用户,特别是用户的PK。平等将是用户 PK + 密码。日期无关紧要。然而,这可能会使事情变得过于复杂,而且我可能不会这样做。

      另一种方法是仅使用密码来表示相等,因为这就是您最终要比较的内容。用户只会在查询中使用,更改日期也是如此。

      执行 HQL 查询以获取 user = {user} 并更改日期

      最后,如上所述,只需对 {user} 执行 HQL 查询,其中 date changed

      最后,如上所述,这些比较都假设您正在使用明文密码或加密新密码以与旧密码进行比较。无论如何,必须采取措施来确保密码的安全性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多