Какая проблема с данными может вызвать «AmbiguousBaseClassException: несколько классов, найденных в иерархии типов, которые отображаются на [...]»? - PullRequest
0 голосов
/ 05 июля 2019

Очевидно, что мое Springboot / Neo4j приложение начало получать это исключение при запуске (примерно при первом обращении к Neo):

AmbiguousBaseClassException: Multiple classes found in type hierarchy that map to [Audit, AppInfo]

После неудачных попыток выполнить различные действияВ отчаянии я сбросил базу данных

MATCH (n) DETACH DELETE n)

, а затем перезапустил.

Внезапно она снова заработала.Другими словами, эта ошибка была связана не только с кодом, а скорее с данными.

Как будто упоминаемая «иерархия типов» - это то, что считывается из базы данных,и я, кажется, был в состоянии "сломать это".

Теперь я беспокоюсь, что я могу получить это всплывающее из ниоткуда, в то время, когда я не смогу просто сброситьданные.

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

Редактировать: я изначально не вставлял специфику вовлеченной структуры, потому что янадеялся, что это «класс» проблем, которые можно было бы описать, защитить и диагностировать, не обращаясь к моему примеру.Возможно, это наивно.

Вот два класса, названные в сообщении об ошибке:

определение

запросы

Редактировать 2: проблема возникла сегодня, с другой парой.

трассировка стека

недавно затронутый класс узлов

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Вот еще один вопрос с чем может быть такая же проблема.В этом конкретном вопросе все узлы Actor и Director в БД также имеют метку Person.И разработчик сымитировал ситуацию с двумя метками, внедрив классы Actor и Director, которые подклассифицировали класс Person.В результате, когда вызывается PersonRepository.findActorsOfMovie(), библиотека OGM не знает, возвращать ли Set из Person экземпляров или Actor экземпляров.Аналогичная проблема существует с PersonRepository.findDirectorOfMovie().Другие методы могут не иметь схожей проблемы, приводя к сбоям, которые могут казаться прерывистыми (но на самом деле это связано с тем, что разные методы используются для разных вариантов использования).

У вас могут быть похожие проблемы с иерархией классов (в отношениик вашей конкретной модели данных БД).Если это так, ваши сигнатуры метода OGM, вероятно, никогда не должны использовать соответствующий базовый класс.

0 голосов
/ 12 июля 2019

Спасибо за помощь. Принятый ответ верен, но некоторые детали и другая «причина» изложены на случай, если кто-то еще борется с ним, как я ...

Что это такое:

Описанная в терминах Java / spring-data-neo4j, эта ситуация действительно возникает, когда узлы из двух «классов» заканчиваются «свойствами» с одинаковыми именами.

Как это может произойти:

Это может (очевидно) произойти, если у вас есть два класса с одинаковым именем Property, как описано в принятом ответе.

Но это также может произойти, если вы продолжите использовать (в Java) узел, который был удален.

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

Как найти виновного:

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

В веб-браузере Neo я обнаружил, что это так же просто, как щелкнуть свойства из класса с наименьшим количеством свойств, заставив его выполнить запрос "покажи мне экземпляры, у которых есть это свойство".

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

...