我有以下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列,所以它不接受映射。
有什么想法吗?
谢谢,
答案 0 :(得分: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
答案 1 :(得分: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放在单独的类中。
此外,请阅读以下有关覆盖Equal的文章,因为您当前的实现可能存在缺陷:http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx特别理解有关继承和基类型的部分。