0

我有以下 HQL 语句:

select distinct t from TaskEntity as 
inner join fetch t.Case as c
inner join fetch c.Client as client 
inner join fetch c.Matter as matter

然而,尽管 Matter 有一个针对它的 FETCH,它仍然作为代理返回。

我对该对象的映射如下

References(x => x.Matter).Columns(new[] {"c_client","c_matter" });

我已经尝试过对此使用 JOIN ,但我的问题是从 1 列到 2 列,所以它不接受映射。

有什么想法吗?

谢谢,

4

2 回答 2

0

我解决了导致此问题的问题。

它还解析为复合 ID!

在项目的早期,Nhibernate 警告说我没有覆盖 Equals 和 GetHashCode,为了规避大量代码更改并促进代码重用,我创建了一个 CompositeBaseEntity 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Case.Infrastructure
{
    public class BaseCompositeEntity : BaseEntity
    {
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }
}

这堂课,把 Nhibernate 告诉我要避免的东西放回原处!由于有两个键来比较相等性,我们必须重写 Equals 和 GetHashCode() 方法,使其类似于:

public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            var t = obj as ClientMatterEntity;
            if (t == null)
                return false;
            if (AccountNumber== t.ClientAcconuntNumber && CaseNumber == t.CaseNumber)
                return true;
            return false;
        }

通过这种方式,Nhibernate 确切地知道应该如何进行比较,然后知道它是否在一级缓存中有那个对象(它会,正如我们指定的 fetch 那样)。

更多信息可以在这里找到:http: //nhforge.org/blogs/nhibernate/archive/2010/07/01/nhibernate-and-composite-keys.aspx

于 2012-04-18T08:43:58.160 回答
0

请注意,您还必须提供正确的 GetHashCode 实现。

您的 Equals 实现也不是很好。

此外,这两种方法都应该返回“静态”值。我没有看过你的课,但应该是这样的:

public class TaskEntity
{
    public int AccountNumber { get; protected set; }
    public int CaseNumber { get; protected set; }
    public Client Client { get; set; }
    public Matter Matter { get; set; }

    public TaskEntity(int accountNr, caseNr)
    {
        AccountNumber = accountNr;
        CaseNumber = caseNr;
    }

    protected TaskEntity() {} // Needed for NHibernate proxies
}

我真的建议您尽可能将组件 ID 放在单独的类中。

此外,请阅读以下有关 override Equal 的文章,因为您当前的实现可能存在缺陷:http: //msdn.microsoft.com/en-us/library/bsc2ak47.aspx特别了解有关继承和基本类型的部分。

于 2012-04-19T11:01:42.997 回答