Как определить, что не было-null свойство ссылается на null или переходное значение в Spring / Hibernate

У меня есть сложный набор кода, который должен пройти через мой домен и объединить некоторые различные сущности, и это заканчивается тем, что нужно объединить кучу других сущностей. Это нетривиальный код, поэтому я не могу привести пример. Проблема в том , что я получаю aNot-null property references a null or transient value, но я не могу понять, какая сущность на самом деле вызывает проблему. Я посмотрел на тип класса сущностей, который говорит, имеет значение null / transient, но каждый раз, когда я вижу его загруженным, я не вижу ни одного, у которого есть значение null или не сохраненное в их ссылках.

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

Я прошел через код hibernate так хорошо, как я могу, но до сих пор я не смог найти экземпляр объекта, на который жалуется hibernate.

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

Есть советы, как отследить этот конкретный объект?

1 ответ

  1. Я полностью согласен со шмоселем: ваш вопрос очень неопределенный.

    Тем не менее: я думаю, что одна из проблем диагностики исключений, таких как ваш, — это поведение hibernates flush. Как вы, вероятно, знаете, hibernate сбрасывает кэш сеанса в конце транзакции или один раз, когда это необходимо (например, hibernate должен сбросить, если SELECTинструкция включает запрос таблицы, на которую влияет еще не сброшенный DELETEоператор).

    Следствием этого, конечно, является то, что время возникновения исключения имеет мало общего со временем «создания»исключения.

    Если другого подхода нет, вы можете спамить flushинструкции по всему коду. В этом нет никакой красоты, но это, вероятно, поможет вам сузить проблему.