NHibernate: как включить отложенную загрузку при сопоставлении один к одному - PullRequest
15 голосов
/ 23 декабря 2008

Отношения «один-к-одному» в nhibernate могут быть загружены как «false» или «proxy». Мне было интересно, если кто-нибудь знает способ сделать ленивое сопоставление один к одному.

Я разработал хак для достижения того же результата, используя ленивый набор, сопоставленный с приватным полем, и публичное свойство возвращает первый результат этого набора. Это работает, но не самый чистый код ...

Заранее спасибо!

Ответы [ 5 ]

20 голосов
/ 23 декабря 2008

Ленивая загрузка один-к-одному не поддерживается, если связь не является обязательной. См. здесь для объяснения.

Это сводится к тому, что для того, чтобы решить, существует ли другая сторона отношений (N), Hibernate должен перейти в базу данных. Поскольку вы уже приняли попадание в базу данных, вы также можете загрузить полный объект.

Хотя бывают случаи, когда имеет смысл нажимать на БД, просто чтобы увидеть, существует ли связанный объект без фактической загрузки объекта (если связанный объект очень «тяжелый»), в настоящее время он не поддерживается в NHibernate.

4 голосов
/ 16 февраля 2009

Есть способ мыслить. Подробно описано здесь :

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest">
  <class name="Person" >
    <id name="PersonID" type="Int32">
      <generator class="identity" />
    </id>
    <property name="LastName" type="String" length="50" />
    <property name="FirstName" type="String" length="50" />
    <many-to-one name="Photo" class="PersonPhoto" />
  </class>

  <class name="PersonPhoto">
    <id name="PersonID" type="Int32">
      <generator class="foreign">
        <param name="property">Owner</param>
      </generator>
    </id>
    <property name="Photo" type="BinaryBlob" />
    <one-to-one name="Owner" class="Person" constrained="true" />
  </class>
</hibernate-mapping> 
4 голосов
/ 23 декабря 2008

Насколько я знаю, нет нехорошего способа ленивой загрузки один-к-одному. Надеюсь, я ошибаюсь, но в прошлый раз я проверил, что это так.

2 голосов
/ 17 сентября 2009

Я попробовал пример, использованный Артемом Тихомировым выше. Я продолжал получать сообщение об ошибке, что столбец Фото не существует. Посмотрев на this , я понял, что отображение немного отключено. Когда я изменил сопоставление «многие к одному», чтобы указать имя столбца следующим образом:

многие-к-одному name = "Photo" column = "PersonID" class = "PersonPhoto" unique = "true"

Я получил это на работу. Надеюсь, это кому-нибудь поможет: о)

0 голосов
/ 24 января 2019

Прочитав ответы здесь, мне удалось заставить его работать. Я просто добавлю этот пример, потому что я использую отношение «один к одному» с Constrained = False и потому что это пример отображения кода

Два класса:

public class Pedido:BaseModel
{
    public virtual BuscaBase Busca { get; set; }
}

public class BuscaBase : BaseModel
    {       
        public virtual Pedido Pedido { get; set; }
    }

Отображения:

public class PedidoMap : ClassMapping<Pedido>
{
    public PedidoMap()
    {
         Id(x => x.Id, x => x.Generator(Generators.Identity));            

         ManyToOne(x => x.Busca, m => 
         { 
             m.Cascade(Cascade.DeleteOrphans);
             m.NotNullable(true); m.Unique(true);
             m.Class(typeof(BuscaBase));
         });    
    }
}

public class BuscaBaseMap : ClassMapping<BuscaBase>
{
    public BuscaBaseMap()
    {            
        Id(x => x.Id, x => x.Generator(Generators.Sequence, g => g.Params(new { sequence = "buscaefetuada_id_seq" })));

        OneToOne(x => x.Pedido, m =>
        {
            m.Lazy(LazyRelation.NoProxy);
            m.Constrained(false);
            m.Cascade(Cascade.None);
            m.Class(typeof(Pedido));
        });            
    }
}

Примечание: я использовал для однозначного сопоставления m.PropertyReference(typeof(Pedido).GetProperty("Busca"));, но это не работает для отложенной загрузки. Вы должны указать отношение, используя класс

Небольшое краткое описание Constrained = False, используемого здесь, объект "Pedido" может не существовать в объекте "BuscaBase".

...