Hibernate подавляет отсутствующие строки при работе с устаревшей базой данных - PullRequest
14 голосов
/ 26 апреля 2011

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

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

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

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

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

Какие-нибудь советы?

Ответы [ 4 ]

16 голосов
/ 27 апреля 2011

Аннотация: @NotFound (action = NotFoundAction.IGNORE)

делает именно то, что я искал. Я нашел это здесь:

Внешний ключ много-к-одному Hibernate По умолчанию 0

2 голосов
/ 26 апреля 2011

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

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

1 голос
/ 26 апреля 2011

Я думаю, что перехватчик мог бы добиться цели.

0 голосов
/ 26 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...