一尘不染

NHibernate:延迟加载IUserType

hibernate

假设我们有一个存储客户详细信息的系统和一个存储员工详细信息的系统(假设情况!)。当EmployeeSystem访问Employee时,使用IUserType中实现的WCF从ClientSystem访问Client信息:

NHibernate映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="EmployeeSystem" namespace="EmployeeSystem.Entities">
   <class name="Employee" table="`Employee`"  >
      <id name="Id" column="`Id`" type="long">
         <generator class="native" />
      </id>
      <property name="Name"/>
      <property 
         name="Client" column="`ClientId`"
         lazy="true"
         type="EmployeeSystem.UserTypes.ClientUserType, EmployeeSystem" /> 
   </class>
</hibernate-mapping>

IUserType的实现:

public class ClientUserType : IUserType
{
    ...

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        object obj = NHibernateUtil.Int32.NullSafeGet(rs, names[0]);

        IClientService clientService = new ClientServiceClient();
        ClientDto clientDto = null;

        if (null != obj)
        {
            clientDto = clientService.GetClientById(Convert.ToInt64(obj));
        }

        Client client = new Client
        {
            Id = clientDto.Id,
            Name = clientDto.Name
        };

        return client;
    }

    ...

}

即使我在属性上具有lazy =“
true”,它也会在加载Employee时立即加载Client。这是正确的行为吗?我是否必须在NullSafeGet中实现自己的延迟加载,还是我缺少什么?


阅读 185

收藏
2020-06-20

共1个答案

一尘不染

是一对一的关系。正如hibernate文档表明的那样,所有这些都是可能的,甚至在xml配置文件中似乎有一些选项可以为一对一关系开启延迟加载,但是它们显然没有任何作用。

一对一的懒惰关联

2020-06-20