nHibernate Поделиться ссылками?

Я получаю следующее исключение при сохранении объекта:

Нашел общие ссылки на коллекцию

Кто-нибудь знает что это значит?

12.12.2008 14:16:12
Было бы здорово, если бы вы могли пометить любой из предоставленных ответов как решение или записать свое собственное решение, если вы его нашли.
Asbjørn Ulsberg 22.09.2011 14:18:47
4 ОТВЕТА

У вас есть ссылка на какой-либо объект в коллекции где-то еще? Другой сеанс, возможно, или даже в рамках того же сеанса в другом объекте? Убедитесь, что при доступе к hibernate вы управляете ТОЛЬКО ссылкой на эти объекты в любом сеансе hibernate.

0
12.12.2008 14:31:26

быстрый гугл говорит

  rel   Group n --- 1 User
         m             ^
         |             | inh
         |  rel        |
         --------- n Member

rel обозначает отношение (ассоциацию), inh обозначает наследование

Исключение выдается после того, как объекты-члены были успешно созданы и затем считаны из базы данных. После того, как последний объект Member был прочитан, транзакция фиксируется, но это не удается.

как выглядят ваши отображения?

3
12.12.2008 14:33:41

Теоретически это означает, что у вас есть 2 записи, которые содержат одну и ту же ссылку на другой объект. На уровне базы данных это, скорее всего, слабая сущность, однако на уровне кода это, скорее всего, будет представлено как коллекция.

Вы скопировали другую коллекцию записей? Например

Blog blog1 =  Blog.Find(1);
Blog blog2 = new Blog();
blog2.Entries =  blog1.Entries;
blog2.Save();

Этот код предназначен для ActiveRecords, но поскольку он построен на основе nHibernate, основные принципы те же.

Когда я столкнулся с этой проблемой, было интересно, что упомянутая в ней коллекция была неправильной. Это был другой.

Если это ваша проблема, попробуйте перебрать каждый элемент и назначить его новой коллекции вместо. Например

Blog blog1 =  Blog.Find(1);
Blog blog2 = new Blog();

foreach (BlogEntry entry in blog1.Entries)
   blog2.Entries.Add(entry);
blog2.Save();
4
15.05.2009 00:05:46

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

public class Being
{
    public string DnaSequence { get; protected set; }
}

public class Animal : Being
{
    public IList<Animal> Relatives { get; protected set; }
}

public class Human : Animal
{
    public string Name { get; protected set; }
}

В вашем Humanотображении важно, чтобы вы не отображали Relativesсвойство. В отображении объединенных подклассов вы должны отображать только те свойства, которые являются уникальными для уровня в иерархии, которую вы отображаете:

  1. Для Being, вы только карту DnaSequenceсобственности.
  2. Для Animal, вы только карту Relativesсобственности.
  3. Для Human, вы только карту Nameсобственности.

Если вы случайно отобразите карту Relativesв Humanсопоставлении, NHibernate выдаст «Обнаруженные общие ссылки на коллекцию».

0
22.09.2011 14:15:06