Создание и получение ассоциированных отображений в nhibernate

StackOverflow https://stackoverflow.com/questions/4665654

Вопрос

Скажем, у меня два постоянных класса Cat а также Hat. Анкет Давайте представим, что отношения между ними являются двунаправленными от одного до одного, так как у кошки может быть много разных шляп, и мы можем пересечь картирование в обоих направлениях. Чтобы создать связь между экземпляром каждого класса, я должен быть в состоянии и исправить меня, если я ошибаюсь, сделайте следующее:

Cat whiskers = new Cat();
Hat redHat = new Hat();
redHat.Id = 1; // normally assigned by generator but this makes example more explicit
whiskers.Hats.Add(redHat);
catService.Save(whiskers);
hatService.Save(redHat);

Имея это в виду, я не смогу получить кошку, которая связана с Redhat, выполнив следующее?

Hat hat = hatService.FindById(1); // redHat has Id 1
Cat cat = hat.Cat; // cat should be whiskers

К сожалению, когда я пытаюсь использовать эту технику, CAT приводит к тому, что в этой последней строке CAT приводит в качестве нулевого объекта. Я предполагаю, что я что-то упускаю в своем картировании «Одно ко многим» в Cat.hbm.xml, или, по крайней мере, я надеюсь, что это что-то простое. Вот как это сейчас выглядит:

<set name="Hats" inverse="true">
  <key column="Id"/>
  <one-to-many class="Hat"/>
</set>

У меня нет отображения в hat.hbm.xml, так как добавление одного привело к ошибке «дублирования картирования». Я читаю спячку документация На сопоставлениях ассоциации, но все еще не может заставить это работать. Что я делаю не так?

Заполните файлы отображения ниже:

Cat.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Domain"
               namespace="Domain">

  <class name="Cat" table="cats" lazy="true">

    <id name="Id">
      <generator class="increment" />
    </id>

    <property name="Name" />

    <set name="Hats" inverse="true">
      <key column="Id"/>
      <one-to-many class="Hat"/>
    </set>

  </class>

</hibernate-mapping>

Hat.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Domain"
               namespace="Domain">

  <class name="Hat" table="hats" lazy="true">

    <id name="Id">
      <generator class="increment" />
    </id>

  </class>

</hibernate-mapping>

Редактировать

Я считаю, что проблема заключалась в том, что я не инициализировал ISet<Hat> ценность в классе кошек. Тем не менее, я столкнулся с новой проблемой. Когда я пытаюсь получить доступ к ассоциациям, я получаю эту ошибку:

Could not initialize proxy - no Session.

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

public Cat GetRelatedCat(Hat hat)
{
    Cat cat;
    using (ISession session = HibernateUtil.GetSessionFactory().OpenSession())
    {
        cat = hat.Cat;
    }
    return cat;
}

Это дает ту же ошибку «без сеанса». Я озадачен.

Это было полезно?

Решение 2

Я решил проблему, создав SessionManager, который позволяет мне открыть сеанс, выполнять любые транзакции и получить доступ к любым прокси -серверам сбора в Session Singleton, а затем закрыть сеанс.

Другие советы

  1. Вам нужно добавить в свою шляпу много-то, что в шляпе. Я думаю, должен работать.

  2. Тогда вам нужно установить обе стороны ассоциации

    asskers.hats.add (redhat);

    redhat.cat = усы;

Я думаю, что это должно заставить ваш образец работать.

Причиной вашей проблемы «без сеанса» является то, что прокси -сервер коллекции работает только с сеансом, с которой он был создан. Таким образом, в вашем примере он работает только с сеансом, который создал экземпляр вашей шляпы. Можно подключить прокси с другим сеансом, но это обычно не рекомендуется, поскольку он имеет сложные последствия для границ транзакций и согласованности данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top