Подтвердить что ты не робот

Hibernate дросселирует недостающие строки при работе с устаревшей базой данных

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

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

Это ошибка, которую я получаю из спящего режима:

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0]

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

Любые советы?

4b9b3361

Ответ 2

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

Вы можете получить больше пробега из фреймворка, например MyBatis SQLMaps, в котором вы предоставляете инструкции SQL для загрузки ваших данных в файлы, внешние по отношению к ваша программа, но структура предоставляет опции для объединения операторов SELECT вместе для загрузки полных графиков объектов. Таким образом, вы можете дополнить операторы SQL логикой, чтобы отфильтровать значения 0.

Ответ 3

Я думаю, что interceptor может сделать трюк.

Ответ 4

Недавно я запрограммировал webapp для устаревшей базы данных с аналогичными проблемами. Вы все еще можете использовать спящий режим, если вы не хотите использовать несколько инфраструктур доступа к данным. То, что я сделал, это выписать собственные SQL-запросы для сложных частей, используя 'createSqlQuery'. В некоторых случаях мне приходилось отображать полные подзапросы или вычисленные значения для свойства entity, но это работает. Для частей базы данных, которые были более регулярными, я все еще мог использовать регулярные сопоставления Hibernate и критерии/запросы HQL.

Другое дело: возможно, вам следует воздержаться от использования терминов типа "не знаю, что они делают" или "muck". Я знаю, что заманчиво рассматривать любой код, оставленный вам предшественниками как низший, но понимаю, что эти люди, вероятно, сделали все возможное в то время. Кроме того, ваш собственный код также не безупречен, поэтому некоторое смирение на месте. Зачем? Во-первых, люди вокруг вас могут ладить с вами немного лучше, если вы все время не пенитесь вокруг рта о предыдущих разработчиках, которые, по их мнению, были очень осведомлены. Просто подсказка.