原先项目使用A表--类名AItem,后来项目需要增加了相同结构的B表--类名BItem,并继承AItem,在使用HQL查询过程中发现,From AItem 会被替换成From BItem,查资料后,发现是NHibernate的继承机制:
在NHibernate中是用多态(polymorphism
)来进行描述两个继承于同一父类的子类情况,在映射文件的Class节点中也有一个polymorphism
的属性用来设定是
隐式还是显式的使用查询多态,为什么我们的映射类中没有出现这个属性的设定呢,polymorphism
= implicit
是默认的。所以我们如果进行的是隐式的查询就可以不用进行设定。以下是摘自博客园renrenqq 翻译的NHibernate中文文档中对polymorphism的解释:
Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。Explicit (显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的实例;同时只有当在这个 <class>
的定义中作为 <subclass>
或者 <joined-subclass>
出现的子类,才会可能返回。 大多数情况下,默认的polymorphism="implicit"
都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。
解决方案:修改AItem的映射文件:class 增加 polymorphism="explicit"。