在nhibernate中将类映射为组件时如何进行构造函数注入?

时间:2009-04-09 12:46:57

标签: nhibernate

对于nhibernate中的映射组件,在hmb文件中是否有一种方法可以指示要使用的重叠构造函数而不是默认构造函数。

在下面的映射中,nHibernate在从数据库读取数据时将使用MyClass的默认构造函数 - 我想知道我们是否可以指示nhibernate使用重载的构造函数?

 <component name="MyProperty" class="MyClass" >
  <property name="Member1" column="member_1" />
  <property name="Member2" column="member_2" />
  <property name="Member3" column="member_3" />
</component >

编辑#1 或者,nHibernate是否允许将静态值映射到属性而不是列? 如下所示:

     <component name="MyProperty" class="MyClass" >
  <property name="Member1" column="member_1" />
  <property name="Member2" column="member_2" />
  <property name="Member3" **value="555"** />
</component >

2 个答案:

答案 0 :(得分:0)

使用select new HQL construct在NHibernate中使用带参数的构造函数的唯一标准方法:

select new Family(mother, mate, offspr)
from Eg.DomesticCat as mother
    join mother.Mate as mate
    left join mother.Kittens as offspr

否则它会将无参数构造函数用于所有目的。我不确定是否可以通过破解NHibernate内部(IClassPersisterIInterceptor等来改变这种情况。)

答案 1 :(得分:0)

NHibernate将始终使用默认构造函数来实例化该类型的对象(除非您想创建某种DTO并通过HQL检索它)然后它将使用属性(或支持字段,如果指定)填充对象。

如果你有一个你不想公开默认(no-args)构造函数的类型,但是你想确保你只能通过特定的构造函数实例化那个类型,那么我总是这样做:

public class MyClass
{
    private MyClass()
    {
       // Default constructor has been made private, so it is not usable
       // by user code, but NHibernate requires a default constructor
       // (it may be private)
    }

    public MyClass( int member1, int member2, string member3 )
    {
    }
}